Как переменная, ссылающаяся на элемент массива, также влияет на другой массив, созданный из первого массива?

$array1=array(1,2);
$x=&$array1[1];
$array2=$array1;
$array2[1]=22;
print_r($array1);

выход:

Array
(
[0] => 1
[1] => 22
)

$array2 просто скопировал значение из $array1 на новый адрес, это не ссылка на $array1так меняется $array2[1] не должен меняться $array1, если я удалю 2-ю строку где $x Ссылаться на $array1[1] тогда он ведет себя нормально.
$array2[1] а также $x не ссылаться на один и тот же адрес. так как $x производя $array2[1] ?

2

Решение

согласно документу php.net:

однако ссылки внутри массивов потенциально опасны. Выполнение нормального (не по ссылке) назначения со ссылкой на правой стороне не превращает левую сторону в ссылку, но ссылки в массивах сохраняются в этих обычных назначениях. Это также относится к вызовам функций, когда массив передается по значению

Другими словами, эталонное поведение массивов определяется поэлементно; эталонное поведение отдельных элементов отделено от эталонного статуса контейнера массива.

см. этот документ php.net:

Ссылка на сайт

2

Другие решения

Выполнение нормального (не по ссылке) назначения со ссылкой на правой стороне не превращает левую сторону в ссылку, но ссылки в массивах сохраняются в этих обычных назначениях.
Смотрите ссылку:

http://php.net/manual/en/language.references.whatdo.php

0

$array1=array(1,2);

После этой строки zval 2-го элемента в $ array1 выглядит так: (is_ref => 0, refcount => 1, …)

$x=&$array1[1];

Эта строка устанавливает поле is_ref в zval в 1 (true) и пересчитывает в 2 (1 + 1)

$array2=$array1;

Эта строка устанавливает refcount в zval в 3 (2 + 1), is_ref по-прежнему 1 (true)

$array2[1]=22;

В этой строке интерпретатор увидел is_ref = 1 и подумал, что там только Рекомендации на этом zval (и не делайте копирование при записи).

0
По вопросам рекламы [email protected]