foreach
(PHP 4, PHP 5, PHP 7, PHP 8)
Языковой конструкцией foreach удобно перебирать
массивы (array) и объекты, классы которых реализуют интерфейс Traversable.
Конструкция foreach выдаст ошибку при попытке
перебора переменной с другим типом данных или неинициализированной переменной.
Разработчику доступны два вида синтаксиса:
Первая форма обходит доступные для перебора данные, заданные
выражением iterable_expression. На каждой итерации значение
текущего элемента присваивается переменной $value.
Вторая форма дополнительно будет присваивать ключ текущего элемента
переменной $key на каждой итерации.
Обратите внимание, что конструкция foreach не изменяет внутренний указатель
массива, с которым, например, работают функции current()
и key().
Разработчику доступна
настройка итерации объектов.
Пример #1 Базовая работа с конструкцией foreach
<?php
/* Пример перебора только значений */
$array = [1, 2, 3, 17];
foreach ($array as $value) {
echo "Значение текущего элемента массива \$array: $value.\n";
}
/* Пример перебора ключей и значений */
$array = [
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
];
foreach ($array as $key => $value) {
echo "Ключ: $key => Значение: $value\n";
}
/* Пример итерации по ключам и значениям многомерного массива */
$grid = [];
$grid[0][0] = "a";
$grid[0][1] = "b";
$grid[1][0] = "y";
$grid[1][1] = "z";
foreach ($grid as $y => $row) {
foreach ($row as $x => $value) {
echo "Значение на позиции x=$x и y=$y: $value\n";
}
}
/* Пример итерации по динамическому массиву */
foreach (range(1, 5) as $value) {
echo "$value\n";
}
?>
Замечание:
Конструкция foreach не поддерживает
подавление сообщений об ошибках оператором
@.
Распаковка вложенных массивов
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
В PHP доступна итерация по массиву массивов и распаковка вложенного массива
в переменные цикла. Массив распаковывают либо путём
деструктуризации массива
через конструкцию [], либо указывают языковую конструкцию list()
как значение цикла.
Замечание:
Деструктуризация массивов
через конструкцию [] возможна только с PHP 7.1.0
Распаковка проигнорирует оставшиеся элементы,
если в значении цикла указали меньшее переменных, чем элементов в массиве.
Аналогично элементы пропускают, оставляя только запятую:
При недостаточном количестве элементов для заполнения переменных в конструкции list()
или конструкции с квадратными скобками генерируется уведомление:
Конструкция foreach и ссылки
Элементы массива возможно напрямую модифицировать внутри цикла путём указания
перед значением $value знака &,
тогда значение присваивается
по ссылке.
Внимание
Ссылка на значение $value последнего элемента массива
сохраняется даже после завершения цикла foreach. Поэтому рекомендуют
уничтожать ссылку конструкцией unset(),
иначе возникнет следующее поведение:
Пример #2 Итерация по значениям константного массива по ссылке
<?php
foreach ([1, 2, 3, 4] as &$value) {
$value = $value * 2;
}
?>