Если я выполняю итерации через массив дважды, после того как ссылкой и затем значением, PHP перезапишет последнее значение в массиве, если я буду использовать то же имя переменной для каждого цикла. Это лучше всего проиллюстрировано через пример:
$array = range(1,5);
foreach($array as &$element)
{
$element *= 2;
}
print_r($array);
foreach($array as $element) { }
print_r($array);
Вывод:
Массив ([0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10)
Массив ([0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 8)
Обратите внимание, что я не ищу фиксацию, я надеюсь понимать, почему это происходит. Также обратите внимание, что этого не происходит, если имена переменной в каждом цикле каждый не называют $element
, таким образом, я предполагаю, что это имеет отношение $element
все еще находясь в объеме и ссылке после конца первого цикла.
После первого цикла $ element по-прежнему является ссылкой на последний элемент / значение $ array.
Вы можете видеть это при использовании var_dump () вместо print_r ()
array(5) {
[0]=>
int(2)
...
[4]=>
&int(2)
}
Обратите внимание, что & в & int (2)
.
Во втором цикле вы присваиваете значения элементу $ element. И поскольку это все еще ссылка, значение в массиве тоже изменяется. Попробуйте использовать
foreach($array as $element)
{
var_dump($array);
}
в качестве второго цикла, и вы увидите.
Так что это более или менее похоже на
$array = range(1,5);
$element = &$array[4];
$element = $array[3];
// and $element = $array[4];
echo $array[4];
(только с циклами и умножением ... эй, я сказал "более или менее"; -))
Вот объяснение от самого человека :
$ y = "some test"; foreach ($ myarray as $ y) { print "$ y \ n"; }
Здесь
$ y
- запись таблицы символов, ссылающаяся на строку, содержащую "некоторый тест". На первой итерации вы, по сути, делаете:$ y = $ myarray [0]; // Не обязательно 0, только 1-й элемент
Итак, теперь хранилище, связанное с
$ y
, перезаписано значением из$ myarray
. Если$ y
связан с каким-либо другим хранилищем через ссылку , это хранилище будет изменено.Допустим, вы делаете это:
$ myarray = array ("Test"); $ a = "A string"; $ y = & $ a; {{ 1}} foreach ($ myarray as $ y) выведите "$ y \ n"; }
Здесь
$ y
связан с тем же хранилищем , что и$ a
через ссылку, поэтому при первой итерации:$ y = $ myarray [0];
Единственное место, куда может попасть строка «Test» - это хранилище, связанное с
$ y
.