Наткнулся только что на очень не приятную особенность PHP при итерации массивов со ссылкой на элементы (конструкция foreach с &).
Смотрите сами:
Получаем то, что ожидали:
Но стоит добавить итерацию по ссылке:
… как получаем неожиданный результат:
Я до конца не понимаю в чем косяк, это как-то связано с тем, что в $value остается ссылка на последний элемент после выхода из первого цикла. Избежать такого поведения можно двумя способами: Либо нужно второй цикл итерировать тоже по ссылке, либо использовать другое имя вместо $value.
Смотрите сами:
$test = array('1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5); print_r($test); foreach ($test as $key => $value) { echo "{$key} => {$value}\n"; }
Получаем то, что ожидали:
Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) 1 => 1 2 => 2 3 => 3 4 => 4 5 => 5
Но стоит добавить итерацию по ссылке:
$test = array('1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5); foreach ($test AS &$value) { // какие-то действия. Но для теста и пустого цикла достаточно } print_r($test); foreach ($test as $key => $value) { echo "{$key} => {$value}\n"; }
… как получаем неожиданный результат:
Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) 1 => 1 2 => 2 3 => 3 4 => 4 5 => <b>4</b>
Я до конца не понимаю в чем косяк, это как-то связано с тем, что в $value остается ссылка на последний элемент после выхода из первого цикла. Избежать такого поведения можно двумя способами: Либо нужно второй цикл итерировать тоже по ссылке, либо использовать другое имя вместо $value.
