一旦数组开始拼接,PHP foreach语句将在末尾跳转

时间:2018-06-22 05:38:12

标签: php arrays foreach array-splice

运行下面的代码时,我遇到了意外的行为。

这是正在发生的事情

一旦满足条件(if ($item_key === 3 || $item_key === 7),并且项目3 移到 $ items_arr 的开头,即 {{1} } 语句跳转到最后一个索引。导致进一步的索引(包括项目7 )未得到处理。

我想知道内部发生了什么,为什么一旦数组开始拼接后, foreach 语句中为什么似乎出现异常终止。

有趣的是,当某些数组在 $ items_arr 的末尾进行拼接时,没有这种行为。

任何想法都值得赞赏。预先感谢。

foreach

输出:

<?php

$items_arr = [];

// adding some items
for ($i = 0; $i < 10; $i++)
{
    $items_arr[] = [
        "id" => $i,
        "name" => "Item {$i}",
    ];
}

/*
 * Some items need to be moved at the
 * beginning of the array.
 */
$i = 0;
foreach ($items_arr as $item_key => &$item)
{
    print "Processing: {$item['name']}" . PHP_EOL;

    // some condition is met
    if ($item_key === 3 || $item_key === 7)
    {
        array_splice($items_arr, $i, 0, [$item]);
        $i++;
        unset($items_arr[$item_key + $i]);
    }
}

1 个答案:

答案 0 :(得分:1)

您正在循环中修改{'00:00:00': {('indoor', 'AC'): 1362.2142857142858, ('indoor', 'Computer'): 399.0, ('indoor', 'Heater'): 2258.375, ('indoor', 'Lights'): 1535.0, ('indoor', 'Microwave'): 1420.0, ('indoor', 'Refridgerator'): 192.38888888888889, ('indoor', 'Television'): 243.66666666666666, ('outdoor', 'AC'): 3470.705882352941, ('outdoor', 'Computer'): 412.4, ('outdoor', 'Heater'): 2274.6666666666665, ('outdoor', 'Lights'): 3475.4736842105262, ('outdoor', 'Microwave'): 1489.9333333333334, ('outdoor', 'Refridgerator'): 195.07692307692307, ('outdoor', 'Television'): 261.5} ,从而使foreach循环不同步(说实话,这是我描述它的最佳方式)。您需要缩短循环并在发生突变时重新开始。

$items_arr