Наткнулся только что на очень не приятную особенность 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.