foreach в PHP: как правильно перебирать массивы, ключи и значения
foreach в PHP — самый удобный способ перебора массивов. Если вы получаете список товаров из базы, массив ошибок формы, настройки пользователя или строки CSV-файла, почти наверняка вам понадобится именно этот цикл. В этой статье разберём синтаксис foreach, работу с ключами и значениями, изменение элементов, вложенные массивы и частые ошибки.
Базовый синтаксис foreach в PHP
Самый простой вариант — пройтись по массиву и получить каждое значение:
<?php
$names = ['Анна', 'Иван', 'Мария'];
foreach ($names as $name) {
echo $name . '<br>';
}
Переменная $name на каждой итерации получает очередной элемент массива. Важно: имя переменной вы выбираете сами, но лучше делать его осмысленным. Для массива $users логично использовать $user, для $products — $product.
Как получить ключ и значение
Часто нужно знать не только значение, но и ключ элемента. Например, в ассоциативном массиве ключами могут быть названия настроек:
<?php
$user = [
'name' => 'Олег',
'email' => 'oleg@example.com',
'role' => 'admin'
];
foreach ($user as $key => $value) {
echo $key . ': ' . $value . '<br>';
}
Конструкция $key => $value означает: в $key попадёт ключ текущего элемента, а в $value — его значение.
foreach для вывода HTML-списка
Один из частых практических сценариев — вывести данные на страницу:
<?php
$products = [
['title' => 'Клавиатура', 'price' => 2500],
['title' => 'Мышь', 'price' => 1200],
['title' => 'Монитор', 'price' => 18000]
];
?>
<ul>
<?php foreach ($products as $product): ?>
<li>
<strong><?= htmlspecialchars($product['title']) ?></strong> —
<?= (int) $product['price'] ?> руб.
</li>
<?php endforeach; ?>
</ul>
Для шаблонов удобно использовать альтернативный синтаксис foreach ... endforeach. Он делает HTML более читаемым. Обратите внимание на htmlspecialchars(): если данные приходят от пользователя или из базы, их нужно экранировать перед выводом.
Изменение элементов массива в foreach
По умолчанию foreach передаёт значение в переменную-копию. Поэтому такой код не изменит исходный массив:
<?php
$prices = [100, 200, 300];
foreach ($prices as $price) {
$price = $price * 1.2;
}
print_r($prices); // [100, 200, 300]
Чтобы изменить элементы, можно использовать ключ:
<?php
$prices = [100, 200, 300];
foreach ($prices as $index => $price) {
$prices[$index] = $price * 1.2;
}
print_r($prices); // [120, 240, 360]
Это самый понятный и безопасный способ для новичков.
Изменение по ссылке: осторожно
В PHP можно перебирать массив по ссылке, добавив & перед переменной значения:
<?php
$numbers = [1, 2, 3];
foreach ($numbers as &$number) {
$number *= 10;
}
unset($number);
print_r($numbers); // [10, 20, 30]
После такого цикла обязательно вызывайте unset($number). Иначе переменная останется ссылкой на последний элемент массива, что может привести к странным ошибкам в следующем foreach.
continue и break внутри foreach
Как и в других циклах, внутри foreach можно пропускать итерации или полностью останавливать перебор:
<?php
$users = [
['name' => 'Анна', 'active' => true],
['name' => 'Игорь', 'active' => false],
['name' => 'Мария', 'active' => true]
];
foreach ($users as $user) {
if (!$user['active']) {
continue;
}
echo $user['name'] . '<br>';
}
continue пропускает неактивного пользователя, а break можно использовать, если нужный элемент уже найден:
<?php
$targetEmail = 'maria@example.com';
$foundUser = null;
foreach ($users as $user) {
if (($user['email'] ?? null) === $targetEmail) {
$foundUser = $user;
break;
}
}
Вложенный foreach для многомерных массивов
Если внутри массива лежат другие массивы, используйте вложенный цикл:
<?php
$orders = [
101 => ['Ноутбук', 'Сумка'],
102 => ['Телефон', 'Чехол', 'Кабель']
];
foreach ($orders as $orderId => $items) {
echo 'Заказ №' . $orderId . '<br>';
foreach ($items as $item) {
echo '- ' . $item . '<br>';
}
}
Главное правило — не называйте переменные одинаково во внешнем и внутреннем цикле. Это ухудшает читаемость и может привести к ошибкам.
Типичные ошибки при использовании foreach
- Ожидать изменения массива без ссылки или ключа. Обычный foreach работает с копией значения.
- Забывать unset() после перебора по ссылке. Это частая причина трудноуловимых багов.
- Не проверять структуру данных. Если ключа нет, используйте оператор ??.
- Выводить данные без экранирования. Для HTML используйте htmlspecialchars().
foreach или for: что выбрать?
Для обычного перебора массива почти всегда выбирайте foreach. Он короче, понятнее и не требует вручную работать с индексами. Цикл for полезен, когда нужен строгий контроль счётчика: например, пройти только первые 10 элементов или двигаться с определённым шагом.
Мини-чеклист хорошего foreach
- Используйте понятные имена: $users as $user, $orders as $order.
- Если нужен ключ, пишите $key => $value.
- Для изменения массива новичкам чаще лучше использовать ключ, а не ссылку.
- Перед выводом в HTML экранируйте строки.
- Не усложняйте вложенность: если внутри 3-4 foreach подряд, возможно, код стоит вынести в функцию.
Если вы хотите не просто запомнить синтаксис, а уверенно применять циклы, массивы, формы, базы данных и авторизацию в реальных проектах, посмотрите курс PHP и MySQL с нуля до уровня самостоятельной разработки — он хорошо дополняет такие базовые темы практикой.
Итог
foreach в PHP — основной инструмент для работы с массивами. Запомните три формы: перебор значений, перебор ключей и значений, а также изменение элементов через ключ или ссылку. Если писать имена переменных осмысленно, экранировать вывод и аккуратно обращаться со ссылками, foreach сделает код проще и надёжнее.
-
Создано 29.06.2026 17:00:38
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.