Что происходит за сценой PHP-foreach? - PullRequest
0 голосов
/ 10 января 2019

Эксперименты в PHP 7.1 (изображение docker nanoninja / php-fpm: 7.1)

В следующем фрагменте кода все ясно:

$arr1 = [1, 2, 3];

foreach ($arr1 as &$value) {
    $value *= 2;
}

Мы имеем массив $arr1 и умножаем все значения на 2. Результат:

array(3) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  &int(6)
}

Но что происходит в этом утверждении:

$arr1 = [1, 2, 3];

foreach ($arr2 = $arr1 as &$value) {
    $value *= 2;
}

Результат обоих массивов $arr1 и $arr2 будет неизменным:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Почему это происходит? Я знаю, что в PHP> 7 foreach работает с копией массива, но с копией какого массива он работает в этом случае $arr1 или $arr2. А почему & не работают?

1 Ответ

0 голосов
/ 10 января 2019

foreach работает только с копией массива в обычном режиме значений, а не в режиме ссылок. Так что изменение в PHP 7 не имеет отношения к этому коду.

Но во втором блоке кода вы не используете переменную в качестве массива для итерации, поэтому нет ничего, на что можно было бы сослаться. Вместо этого у вас есть выражение, а значением выражения является копия массива. По сути это эквивалентно выполнению:

$temp = $array1 = $array2;
foreach ($temp as &$value) {
    $value *= 2;
}

Это обновит $temp, но не $array1 или $array2.

...