@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 ?
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 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, которая при каждой итерации принемает значение текущего элемента массива, ну и в конце ссылается на саму себя, доставая результат, который был записан на предидущей итерации...
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 февр. 2020, в 05:15
5000 руб./за проект
26 февр. 2020, в 01:14
600 руб./в час
26 февр. 2020, в 01:13
1500 руб./за проект