Изменение массива при его обходе

В PHP 7+ foreach по значению выведет 12345: изменение исходного массива не меняет уже начатый обход. После цикла в массиве останется только элемент с ключом 0 и значением 1.

Короткий ответ

Что ответить на собеседовании

В PHP 7+ foreach по значению выведет 12345: изменение исходного массива не меняет уже начатый обход. После цикла в массиве останется только элемент с ключом 0 и значением 1.

Подробный разбор

Ответ с пояснениями

Условие

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

$array = [1,2,3,4,5];
foreach ($array as $k => $v) {
 echo $v;
 unset($array[$k+1]);
}

Ответ

В PHP 7+ foreach по значению выведет 12345: изменение исходного массива не меняет уже начатый обход. После цикла в массиве останется только элемент с ключом 0 и значением 1.

Цикл последовательно получает исходные пары ключ/значение. На шагах с ключами 0, 1, 2 и 3 удаляются элементы 1, 2, 3 и 4; удаление несуществующего ключа 5 на последнем шаге ничего не меняет. Отсутствие пробелов в echo даёт слитную строку. Обход по ссылке &$v имеет другое поведение, поэтому это различие важно не пропустить.

Источник: wiki.php.net.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее