PHP foreach: цикл по массивам с ключом и значением

PHP foreach — это идиоматичный способ обхода массива или объекта, реализующего Traversable, без ручного отслеживания индекса. Используйте foreach ($array as $key => $value), когда на каждой итерации нужны ключ и значение. Для обновлений на месте итерируйтесь по ссылке (&$value) и вызывайте unset() для переменной цикла после завершения, чтобы избежать случайных перезаписей.

Пример PHP foreach для обхода пар ключ-значение

Вывод:

Результат появится здесь...

Вывод:

яблоко: $1.2
хлеб: $2.5
молоко: $0.99

Как работает этот пример

  1. $prices — ассоциативный массив, который сопоставляет названия товаров с ценами.
  2. foreach ($prices as $item => $price) на каждой итерации присваивает текущий ключ переменной $item, а текущее значение — $price; ручной индекс и count() не нужны.
  3. Каждая итерация выводит пару ключ-значение. foreach работает и с индексными, и с ассоциативными массивами с одинаковым синтаксисом.

Частые ошибки с PHP foreach

Забыть unset() после цикла по ссылке

Неправильно:

foreach ($items as &$item) {
    $item = strtoupper($item);
}
foreach ($items as $item) {} // перезаписывает последний элемент

Правильно:

foreach ($items as &$item) {
    $item = strtoupper($item);
}
unset($item);

После foreach по ссылке переменная цикла всё ещё указывает на последний элемент. Повторное использование этой переменной может изменить последний элемент вместо локального значения цикла.

Ожидать, что цикл по значению изменит массив

Неправильно:

foreach ($prices as $price) {
    $price *= 1.10; // изменяет копию, а не массив
}

Правильно:

foreach ($prices as &$price) {
    $price *= 1.10;
}
unset($price);

Итерация по значению даёт каждой $price копию элемента. Изменения этой копии не попадают в исходный массив.

PHP foreach vs цикл for

foreachfor
Не нужен индекс — чище для полного обхода.Нужен, когда требуется арифметика по индексу, шаговые приращения или обратный обход.
Работает с ассоциативными массивами и объектами Traversable.Работает только с числовыми индексами; для ассоциативных ключей нужен array_keys().
Менее удобен для шага (например, каждый второй элемент).Естественно подходит для $i += 2 или обратного счёта.

Используйте foreach для стандартного полного прохода по массиву. Переходите на for, когда тело цикла зависит от числовой позиции или непоследовательного доступа.

FAQ

Как получить и ключ, и значение в цикле PHP foreach?

Используйте синтаксис $key => $value: foreach ($array as $key => $value). На каждой итерации он присваивает ключ ($key) и значение ($value) как для индексных, так и для ассоциативных массивов. Если нужны только значения, используйте foreach ($array as $value).

Может ли foreach итерироваться по объектам, или только по массивам?

foreach работает с любым значением, реализующим интерфейс Traversable, включая реализации Iterator и IteratorAggregate. Для обычных объектов он итерируется по видимым свойствам в зависимости от области видимости: внутри класса доступны все свойства, снаружи — только public.

В чём разница между foreach и array_map в PHP?

foreach — это управляющая конструкция, которая выполняет блок для каждого элемента и допускает побочные эффекты, например echo или ранний break. array_map применяет callback и возвращает новый массив. Используйте array_map, когда нужен новый массив без мутаций.