【问题标题】:Iterating through multiple arrays and assigning positions遍历多个数组并分配位置
【发布时间】:2013-10-25 16:11:37
【问题描述】:

为此工作了 4 个小时。我的眼睛开始受伤,我的大脑因悖论而疲惫不堪。

所以这里是设置。 3个数组:

  • 广告帖子数组

  • 一组普通帖子

  • 从数组 1 中拉出的已取位置数组

广告阵列具有预定义的广告位。

我已经合并了 2 个数组,因为广告基本上都集成到了正常的帖子流中。我什至能够根据帖子的自然顺序以及为广告分配的位置为每个帖子分配一个位置。因此,如果帖子的自然位置中有广告,则该帖子的位置需要向前提升一个。如果流中只有 1 个广告,这很容易。但是这个东西是为任意数量的多个广告设置的。

这就是我如何改变数组中每个非广告元素的位置。我认为我可以再运行几次,这应该涵盖有其他广告的情况,但它似乎是错误的和不圣洁的。

想知道是否有人可以解决这个问题,因为我厌倦了自己眼泪的味道。

if(in_array($newarray[$key]['position'],$taken)){ 

$newkey = ($newarray[$key]['position'] + 1);
$newarray[$key]['position'] = $newkey;
$taken[] = $newkey;

最后我需要所有位置正确分配且唯一的合并数组。

【问题讨论】:

  • 我们将不胜感激一些带有数组数据和所需结果的示例。

标签: php arrays


【解决方案1】:

您可以编写一个递归函数来提取下一个可用的位置编号,但如果您正在处理少量帖子 + 广告,则类似下面的操作会既快速又简单。请注意,这假设您需要保留 ads 和 posts 数组的原始键。如果您不需要这样做,那么您可以进一步简化它。

// Sample array of ads
$ads = array('ad1' => array('position' => 1),
             'ad2' => array('position' => 4),
             'ad3' => array('position' => 6),
             'ad4' => array('position' => 10));
// Identify ad positions
foreach ( $ads as $k => $v ) {
    $adPositions[$v['position']] = $v['position'];
}
// Identify available positions
$availablePositions = array_combine(range(1,100), range(1,100));
$availablePositions = array_diff_key($availablePositions, $adPositions);
// Sample posts
$posts = array('post1' => array('position' => false),
               'post2' => array('position' => false),
               'post3' => array('position' => false),
               'post4' => array('position' => false),
               'post5' => array('position' => false),
               'post6' => array('position' => false));
// Use first (lowest number) available position as post position
foreach ( $posts as $k => $v ) {
    $posts[$k]['position'] = array_shift($availablePositions);
}
// Merge arrays
$merged = array_merge($ads, $posts);
// Create list of positions for use with array_multisort
foreach ( $merged as $k => $v ) {
    $position[$k] = $v['position']; 
}
// Sort $merged by ['position']
array_multisort($position, SORT_ASC, $merged);

给你:

Array
(
    [ad1] => Array
        (
            [position] => 1
        )

    [post1] => Array
        (
            [position] => 2
        )

    [post2] => Array
        (
            [position] => 3
        )

    [ad2] => Array
        (
            [position] => 4
        )

    [post3] => Array
        (
            [position] => 5
        )

    [ad3] => Array
        (
            [position] => 6
        )

    [post4] => Array
        (
            [position] => 7
        )

    [post5] => Array
        (
            [position] => 8
        )

    [post6] => Array
        (
            [position] => 9
        )

    [ad4] => Array
        (
            [position] => 10
        )

)

【讨论】:

  • 非常感谢!我不知道为什么,但 SO 从未发送过您的回答通知。我要试试这个。
猜你喜欢
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多