PHP Передача по исходной ошибке после использования того же var

Взгляните на этот код и помогите мне понять результат

$x = array('hello', 'beautiful', 'world'); $y = array('bye bye','world', 'harsh'); foreach ($x as $n => &$v) { } $v = "DONT CHANGE!"; foreach ($y as $n => $v){ } print_r($x); die; 

Он печатает:

 Array ( [0] => hello [1] => beautiful [2] => harsh ) 

Почему он изменяет элемент LAST из $ x? это просто не следует никакой логике!

После выполнения этого цикла:

 foreach ($x as $n => &$v) { } 

$v заканчивается ссылкой на $x[2] . Независимо от того, что вы назначили $v присваивается $x[2] . Поэтому на каждой итерации второго цикла:

 foreach ($y as $n => $v) { } 

$v (или я должен сказать, что $x[2] ) становится:

  • 'bye bye'
  • 'world'
  • 'harsh'
 // ... $v = "DONT CHANGE!"; unset($v); // ... с // ... $v = "DONT CHANGE!"; unset($v); // ... 

потому что $v по-прежнему является ссылкой, которая затем берет последний элемент в последнем цикле foreach.

EDIT: см. Ссылку, где она читается (в блоке кода)

unset($value); // break the reference with the last element

Циклы Foreach не являются функциями. Амперсанд (&) в foreach не работает, чтобы сохранить значения, например, в функциях. Поэтому, даже если у вас есть $ var во втором foreach (), не ожидайте, что он будет как «призрак» из цикла.