0

Странное поведение foreach при использовании ссылок: foreach ($a as &$v) { ... }

19

Описание проблемы:

У меня есть следующий код на 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 ответ(ов)

0

Первый цикл foreach не вносит никаких изменений в массив, что мы и ожидаем. Однако он вызывает присвоение $v ссылки на каждый из элементов массива $a, так что к моменту завершения первого цикла $v фактически ссылается на $a[2].

Как только начинается второй цикл, $v получает значение каждого элемента. Однако $v уже является ссылкой на $a[2], и, следовательно, любое значение, присвоенное ему, будет автоматически скопировано в последний элемент массива!

Таким образом, в процессе первой итерации $a[2] станет нулем, затем единицей и снова единицей, фактически копируя само себя. Чтобы избежать этой проблемы, вам следует всегда очищать переменные, которые вы используете в циклах foreach по ссылке, или, лучше того, полностью избегать использования ссылок.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь