Почему PHP перезаписывает значения, когда я выполняю итерации через этот массив дважды (ссылкой значением)

Если я выполняю итерации через массив дважды, после того как ссылкой и затем значением, 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 все еще находясь в объеме и ссылке после конца первого цикла.

5
задан j0k 4 September 2012 в 12:02
поделиться

2 ответа

После первого цикла $ 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];

(только с циклами и умножением ... эй, я сказал "более или менее"; -))

7
ответ дан 18 December 2019 в 14:43
поделиться

Вот объяснение от самого человека :

 $ 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 .

5
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: