Циклы в PHP: for, while, foreach

Циклы позволяют выполнять один и тот же код много раз: вывести список товаров, обработать строки файла, посчитать сумму заказа. В PHP четыре цикла — for, while, do...while и foreach. Разберём каждый на примерах.

Цикл for

for используют, когда заранее известно число повторений. В круглых скобках три выражения через точку с запятой: начальное значение счётчика, условие продолжения и шаг:

<?php
for ($i = 1; $i <= 5; $i++) {
    echo "Шаг $i\n";
}
// Вывод:
// Шаг 1
// Шаг 2
// Шаг 3
// Шаг 4
// Шаг 5

Как это читается: «начни с $i = 1; пока $i <= 5 — выполняй тело; после каждого прохода увеличивай $i на 1». Оператор $i++ — короткая запись $i = $i + 1.

Счётчик может меняться как угодно — например, идти в обратную сторону или через два:

<?php
for ($i = 10; $i > 0; $i -= 2) {
    echo $i . " ";
}
// Вывод: 10 8 6 4 2

Цикл while

while повторяет тело, пока условие истинно. Его выбирают, когда число повторений заранее неизвестно:

<?php
$balance = 100;
$day = 0;

while ($balance > 0) {
    $balance -= 30; // ежедневные расходы
    $day++;
}

echo "Деньги закончились на день $day"; // Вывод: Деньги закончились на день 4

Внимательно следите, чтобы условие когда-нибудь стало ложным, иначе получится бесконечный цикл и скрипт зависнет.

do...while

Разновидность while, у которой тело выполняется минимум один раз — условие проверяется после прохода:

<?php
$attempts = 0;

do {
    $attempts++;
    echo "Попытка $attempts\n";
} while ($attempts < 3);
// Вывод:
// Попытка 1
// Попытка 2
// Попытка 3

Цикл foreach

foreach создан специально для массивов: он перебирает элементы по очереди без всяких счётчиков. В веб-разработке это самый используемый цикл:

<?php
$languages = ["PHP", "JavaScript", "Python"];

foreach ($languages as $language) {
    echo "Изучаю $language\n";
}
// Вывод:
// Изучаю PHP
// Изучаю JavaScript
// Изучаю Python

Если нужны не только значения, но и ключи, используется форма as $key => $value:

<?php
$prices = [
    "хлеб" => 45,
    "молоко" => 80,
    "сыр" => 350,
];

foreach ($prices as $product => $price) {
    echo "$product — $price руб.\n";
}
// Вывод:
// хлеб — 45 руб.
// молоко — 80 руб.
// сыр — 350 руб.

break и continue

Двумя ключевыми словами можно управлять ходом любого цикла:

  • break — немедленно выйти из цикла;
  • continue — пропустить текущую итерацию и перейти к следующей.
<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 !== 0) {
        continue; // пропускаем нечётные
    }
    if ($i > 6) {
        break; // дальше не идём
    }
    echo $i . " ";
}
// Вывод: 2 4 6

Здесь % — остаток от деления: у чётных чисел остаток от деления на 2 равен нулю.

Практический пример: сумма заказа

Соберём всё вместе — посчитаем стоимость корзины и применим скидку:

<?php
$cart = [
    "Клавиатура" => 2500,
    "Мышь" => 1200,
    "Коврик" => 400,
];

$total = 0;

foreach ($cart as $item => $price) {
    $total += $price;
    echo "$item: $price руб.\n";
}

if ($total > 3000) {
    $total *= 0.9; // скидка 10%
}

echo "Итого со скидкой: $total руб.";
// Вывод:
// Клавиатура: 2500 руб.
// Мышь: 1200 руб.
// Коврик: 400 руб.
// Итого со скидкой: 3690 руб.

Какой цикл выбрать

СитуацияЦикл
Известно точное число повторенийfor
Повторять, пока выполняется условиеwhile
Выполнить хотя бы один раз, потом проверятьdo...while
Перебрать массивforeach

Что мы узнали

  • for подходит, когда число итераций известно заранее: счётчик, условие, шаг.
  • while крутится, пока условие истинно; do...while гарантирует хотя бы один проход.
  • foreach — главный цикл для массивов, умеет отдавать и ключи, и значения.
  • break прерывает цикл, continue пропускает итерацию.
  • Бесконечный цикл — частая ошибка: проверяйте, что условие выхода достижимо.
Проверьте себя
1. Какой цикл PHP специально предназначен для перебора элементов массива?
Afor
Bwhile
Cdo...while
Dforeach
2. Что выведет: `for ($i = 10; $i > 0; $i -= 4) { echo $i . ' '; }`?
A10 6 2
B10 7 4 1
C10 6 2 -2
D10 8 6 4 2
3. Чем `do...while` отличается от обычного `while`?
Ado...while выполняет тело минимум один раз, then проверяет условие
Bdo...while не поддерживает break
Cdo...while быстрее, чем while
DВ do...while условие указывается в начале
4. Как перебрать ассоциативный массив и получить и ключ, и значение одновременно?
Aforeach ($arr as $val)
Bforeach ($arr as $key => $val)
Cfor ($arr => $key => $val)
Dwhile ($arr as $key, $val)

Закрепите практикой

Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.

Поддержать проект