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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 10:42
150000 руб./за проект
25 апр. 2024, в 10:41
2000 руб./за проект
25 апр. 2024, в 10:25
2000 руб./за проект