PHP оператор foreach переходит в конец, когда массив объединяется в начале

Я столкнулся с довольно неожиданным поведением при выполнении кода ниже.

Вот что происходит:

Раз условие (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

0

Решение

Вы модифицируете $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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector