Pull to refresh

Осторожнее с итерацией массивов по ссылке

Reading time1 min
Views520
Наткнулся только что на очень не приятную особенность PHP при итерации массивов со ссылкой на элементы (конструкция foreach с &).

Смотрите сами:
$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.
Tags:
Hubs:
Total votes 12: ↑5 and ↓7-2
Comments19

Articles