2014-02-21 2 views
0

У меня есть $array1. Затем я создаю $array2 по array_filter из $array1. Когда я просто перебираю более $array2 (пустой цикл), как-то создается дубликат элемента, и он заменяет существующий элемент.Пустой foreach на одном массиве изменяет другой массив

Вот пример:

<? 
    $array2 = array_filter($array1, function ($elem) use ($idsToExclude) { 
     return in_array($elem["id"], $idsToExclude); 
    }); 
?> 

<? 
    echo "== before iterating ==<br>"; 
     print_r($array1); 
?> 
    <? foreach ($array2 as $elem) :?> 
     <!-- WRYYYYYYY! --> 
    <? endforeach;?> 
    <? 
     echo "== after iterating ==<br>"; 
     print_r($array1); 
?> 

И выход:

== before == 
17 =>  Array (
    id => 1 
    name => Test account 1 
) 
18 =>  Array (
    id => 102 
    name => Test account 2 
) 
19 =>  Array (
    id => 37 
    name => Test account 3 
) 
20 =>  Array (
    id => 82 
    name => Test account 4 
) 
21 =>  Array (
    id => 97 
    name => Test account 5 
) 

== after == 
17 =>  Array (
    id => 1 
    name => Test account 1 
) 
18 =>  Array (
    id => 97 
    name => Test account 5 
) 
19 =>  Array (
    id => 37 
    name => Test account 3 
) 
20 =>  Array (
    id => 82 
    name => Test account 4 
) 
21 =>  Array (
    id => 97 
    name => Test account 5 
) 

Обратите внимание, что во втором выходе Test account 5 заменить Test account 2. Если комментарий foreach прокомментирован, $array1 не изменяются.

+0

Это не очень читаемым. Можете ли вы вывести вывод 'print_r()' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

+2

Ваша проблема не может быть воспроизведена: http://ideone.com/LR0W0x. Однако вы должны иметь в виду примечания и предупреждения отсюда: http://www.php.net/manual/en/control-structures.foreach.php. – hindmost

+0

Я придумал те же результаты, что и задние. [Codepad.viper-7.com/sgcv1U](http://codepad.viper-7.com/sgcv1U). Не удалось воспроизвести. –

ответ

0

$array1 был создан следующий код:

foreach ($array1 as &$elem) { 
    // Do something 
} 

Обратите внимание на & оператор, который позволяет changee в петле оригинальный $elem (а не его копия). Поскольку &$elem не был отменен, цикл был перенесен из неопределенного поведения.

Так правильный код будет

foreach ($array1 as &$elem) { 
    // Do something 
} 

unset($elem); 
Смежные вопросы