Я столкнулся с довольно неожиданным поведением при выполнении кода ниже.
Вот что происходит:
Раз условие (if ($item_key === 3 || $item_key === 7)
) встречен и Пункт 3 перемещен в начало $ items_arr, foreach
оператор переходит к последнему индексу. В результате чего дальнейшие показатели, в том числе Пункт 7, не обрабатывается.
Я хотел бы знать, что происходит внутри страны, и почему в foreach
оператор один раз массив сплайсинга в начале.
Интересно, где такого поведения нет, когда некоторые массивы сращиваются в конце $ items_arr.
Любая мысль ценится. Заранее спасибо.
<?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]);
}
}
Выход:
Processing: Item 0
Processing: Item 1
Processing: Item 2
Processing: Item 3
Processing: Item 9
Вы модифицируете $items_arr
внутри цикла, который десинхронизирует цикл foreach (это, честно говоря, лучший способ, которым я могу это описать). Вам нужно будет замкнуть петлю и начать заново, когда произошла мутация.
$mutated = null;
do {
$mutated = false;
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]);
$mutated = true;
break;
}
}
}
while($mutated == true);
Других решений пока нет …