Что не так с адресацией переменных в php?
Выполняю код по смыслу такого содержания:
2 часа выявлял ошибку :-(
Если убрать:
<?php
$a['s'] = [
["name"=>"test1"],
["name"=>"test2"],
["name"=>"test3"],
];
foreach($a as $k=>&$v1){
}
$test = $a;
foreach($test['s'] as $k=>&$v2){
if($v2['name'] == "test1"){
$v2['value'] = "test4";
}
}
echo '<pre>'.print_r($a,1).'</pre>';
Выводит:Array
(
[s] => Array
(
[0] => Array
(
[name] => test1
[value] => test4
)
[1] => Array
(
[name] => test2
)
[2] => Array
(
[name] => test3
)
)
)
Почему переменная $a изменилась, если меняем только переменную $test? Что не так с адресацией в php? 2 часа выявлял ошибку :-(
Если убрать:
foreach($a as $k=>&$v1){
}
то все в порядке
Поблагодарить автора
Отправить деньги
Комментарии: 4
А если убрать у переменных &
foreach($a as $k=> $v1){
}
у вас код так же заработает как хотите. вы же по сути ссылку делаете на значения.
Ну я в курсе, что так заработает. Я не в курсе почему неожиданно сработало так, что переменная которая вроде не менялась изменилась?
Нужный код я поправил, чтоб заработал. Хотелось бы понимание что происходит, чтоб не нарываться в будущем
вы же по сути ссылку делаете на значения.Можно поподробнее. Вот ссылка на значение &$v1. И с ней ничего не делаем. Вот ссылка на на значение &$v2. Там меняем переменную. Икак происходит что изменилась переменная которую не трогал?
Нужный код я поправил, чтоб заработал. Хотелось бы понимание что происходит, чтоб не нарываться в будущем
Все просто.
в момент когда вы выставляете & система должна создать ссылку на значение. А для того чтобы это сделать нужно значение которое определилось в $a Тоже было ссылкой.
таким образом теперь $a ссылается на массив в памяти, где частичная ссылка на элемент массива в итерации $v.
Поэтому следующее действие $test = $a; просто копирует ссылку (или создает ссылку на тот же элемент памяти) на наш первый массив-со всеми значениями и в обоих переменных ссылка на один и тот же элемент в памяти. Далее, думаю понятно почему изменения в$v2 по сути являются изменением $a
в момент когда вы выставляете & система должна создать ссылку на значение. А для того чтобы это сделать нужно значение которое определилось в $a Тоже было ссылкой.
таким образом теперь $a ссылается на массив в памяти, где частичная ссылка на элемент массива в итерации $v.
Поэтому следующее действие $test = $a; просто копирует ссылку (или создает ссылку на тот же элемент памяти) на наш первый массив-со всеми значениями и в обоих переменных ссылка на один и тот же элемент в памяти. Далее, думаю понятно почему изменения в$v2 по сути являются изменением $a
Спасибо. Теперь более-менее понятно
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.