@vrazbros

Как работает php foreach по ссылке?

Из документации по php:
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr = array(2, 4, 6, 8)

// Без unset($value), $value все еще ссылается на последний элемент: $arr[3]

foreach ($arr as $key => $value) {
    // $arr[3] будет перезаписываться значениями $arr при каждой итерации цикла
    echo "{$key} => {$value} ";
    print_r($arr);
}
// ...И в конце концов предпоследнее значение определит окончательное содержимое $arr[3]

// вывод:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )


// Без unset($value), $value все еще ссылается на последний элемент: $arr[3] - так ведь это значение 4
откуда при последнем переборе в [3] => 2, 4, 6, 6 ?
  • Вопрос задан
  • 1017 просмотров
Пригласить эксперта
Ответы на вопрос 1
Kasperenysh
@Kasperenysh
Рецидив в особо острой форме))
После первого цикла с сылкой внутренний указатель ссылки остается именно на элементе $arr[3] !
При повторном foreach проблема именно с $arr[3], она на первой итерации ссылается получает значение первого элемента массива, если в этом месте сделать выход из цикла, то массив будет вида (2, 4, 6, 2), на аторой итераци, примет значение второго элемента (2, 4, 6, 4), на третьей итерации - значение третьего элемента (2, 4, 6, 6), и на последней она примет значения самойсебы, что с предидущей итерации мы видим у четвертого элемента значение 6, значит (2, 4, 6, 6)

Т.е. в последней ячейке массива лежит ссыль на $value, которая при каждой итерации принемает значение текущего элемента массива, ну и в конце ссылается на саму себя, доставая результат, который был записан на предидущей итерации...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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