Взгляните на этот код и помогите мне понять результат
$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 (), не ожидайте, что он будет как «призрак» из цикла.