Странное поведение foreach при использовании ссылок: foreach ($a as &$v) { ... }
Описание проблемы:
У меня есть следующий код на PHP:
<?php
$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { }
foreach ($a as $v) { }
print_r($a);
?>
На первый взгляд, программа выглядит нормально, но вывод, который я получаю, таков:
Array
(
[0] => a
[1] => b
[2] => c
[3] => c
)
Я не понимаю, почему последний элемент массива изменился на 'c'. Можете, пожалуйста, объяснить мне, что здесь происходит? Как это связано с использованием ссылки в первом цикле foreach
?
1 ответ(ов)
Первый цикл foreach
не вносит никаких изменений в массив, что мы и ожидаем. Однако он вызывает присвоение $v
ссылки на каждый из элементов массива $a
, так что к моменту завершения первого цикла $v
фактически ссылается на $a[2]
.
Как только начинается второй цикл, $v
получает значение каждого элемента. Однако $v
уже является ссылкой на $a[2]
, и, следовательно, любое значение, присвоенное ему, будет автоматически скопировано в последний элемент массива!
Таким образом, в процессе первой итерации $a[2]
станет нулем, затем единицей и снова единицей, фактически копируя само себя. Чтобы избежать этой проблемы, вам следует всегда очищать переменные, которые вы используете в циклах foreach
по ссылке, или, лучше того, полностью избегать использования ссылок.
PHP: Как определить первую и последнюю итерацию в цикле foreach?
Как добавить элементы в пустой массив в PHP?
Вставка нового элемента в массив в любом месте в PHP
Сортировка массива объектов по одному свойству
Отправка многомерного массива с помощью PHP и CURL