foreach
Ключевое слово foreach — конструкция цикла в PHP для перебора массивов и объектов. Синтаксис и примеры использования.
Цикл foreach в PHP
foreach — это специализированный цикл PHP для перебора массивов и объектов. В отличие от цикла for, он не требует счётчика или индекса — он автоматически проходит по каждому элементу по одному, что делает его наиболее распространённым и надёжным способом обработки коллекций в PHP.
В этой главе рассматриваются две формы foreach, перебор по ссылке, распаковка вложенных массивов с помощью list(), наиболее распространённая ловушка и случаи, когда стоит использовать foreach вместо других циклов PHP.
Синтаксис
foreach имеет две формы.
Только значение — когда вас интересует лишь значение каждого элемента:
foreach ($array as $value) {
// do something with $value
}Ключ и значение — когда нужен и ключ массива (обязательно для ассоциативных массивов):
foreach ($array as $key => $value) {
// do something with $key and $value
}На каждом проходе PHP копирует текущий элемент в $value (и его ключ в $key), затем переходит к следующему элементу, пока массив не будет исчерпан.
Перебор индексированного массива
Перебор ассоциативного массива
С формой $key => $value вы получаете обе части каждой пары:
<?php
$person = ["name" => "John", "age" => 30, "city" => "New York"];
foreach ($person as $key => $value) {
echo $key . ": " . $value . PHP_EOL;
}
// Output:
// name: John
// age: 30
// city: New YorkИзменение значений по ссылке
По умолчанию $value является копией, поэтому изменение его внутри цикла не влияет на исходный массив. Добавьте перед ним &, чтобы перебирать по ссылке и записывать изменения обратно:
<?php
$prices = [10, 20, 30];
foreach ($prices as &$price) {
$price *= 2; // modifies the array in place
}
unset($price); // important: break the reference
print_r($prices);
// Output:
// Array
// (
// [0] => 20
// [1] => 40
// [2] => 60
// )Внимание: всегда выполняйте
unset($price)после цикла по ссылке. Переменная по-прежнему указывает на последний элемент, поэтому последующее присвоение значения$price— или второйforeach, повторно использующий это имя, — незаметно испортит массив.
Распаковка вложенных массивов с помощью list()
Когда каждый элемент сам является массивом, его можно деструктурировать прямо в цикле с помощью list() (или сокращённого синтаксиса [] в PHP 7.1+):
<?php
$points = [[1, 2], [3, 4], [5, 6]];
foreach ($points as [$x, $y]) {
echo "x=$x, y=$y" . PHP_EOL;
}
// Output:
// x=1, y=2
// x=3, y=4
// x=5, y=6Когда использовать foreach
- Используйте
foreachдля любого массива или итерируемого объекта, когда нужны все элементы — это самый понятный выбор, который не может выйти за пределы массива. - Используйте цикл
for, когда нужен точный контроль над счётчиком (пропуск элементов, шаг 2, обратный отсчёт). - Используйте
while, когда количество итераций заранее неизвестно и зависит от условия.
Вы также можете выйти из foreach досрочно с помощью break или пропустить итерацию с помощью continue, точно так же, как в других циклах.