В 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.