foreach в PHP: как правильно перебирать массивы, ключи и значения

foreach в PHP: как правильно перебирать массивы, ключи и значения

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 сделает код проще и надёжнее.

    Источник

    НЕТ КОММЕНТАРИЕВ

    Оставить комментарий