Интересное поведение. Получаем дубликат предпоследнего элемента и теряем последний элемент. Такой код написать надо еще умудриться, но все же. Код (Text): <?php $cities = [ [ 'id' => 1, 'name' => 'Yaroslavl', 'desc' => 'text', ], [ 'id' => 2, 'name' => 'Cheboksary', 'desc' => 'text', ], [ 'id' => 3, 'name' => 'Saint-Petersburg', 'desc' => 'text', ], [ 'id' => 4, 'name' => 'Kazan', 'desc' => 'text', ], ]; foreach ($cities as &$city) { unset($city['desc']); } print_r($cities); foreach ($cities as $city) { print_r($city); } кому лень запускать скрин прилагается
имя другое дай переменной и все PHP: foreach ($cities as $city2) { print_r($city2); } либо можешь оставить - но перед вторым циклом удали unset($city); тем самым отвязав ссылку на $cities
Да это решение, но представленный пример довольно надуманный. На подобное я наткнулся при решении задачи "в лоб". Итоговый скрипт конечно же не содержал два цикла.
> Status: Not a bug не баг, а фича. с указателями надо работать оооочень осторожно. --- Добавлено --- фича в особенностях области действия переменных (scope), в пхп переменная цикла не локальна для цикла, а остаётся жить дальше. всё остальное — логичные следствия.
@noRoman, замените первый print_r на var_dump и увидите для элемента с индексом 3 нечто отличное от предыдущих. И если уж используете ссылку, то действительно требуется внимательность . Если эта переменная как ссылка далее не нужна, а имя очень нравится - можно использовать unset($city); сразу после цикла.
Об это все спотыкаются, когда начинают только пользоваться ссылками в php. Я в первый год работы тоже такую тему здесь постил
проблем не будет, если PHP: либо foreach ($cities as $cKey => $city) { unset($cities[$cKey]['desc']); } либо foreach ($cities as &$city) { unset($city['desc']); } unset($city)
как теперь нам узнать, что ты не Молотова, например, а именно Немолотова. Теперь только гадать и верить. А так у нас были доказульки подлинности. Теперь их нет.