Перейти к содержимому
Теория · Циклы · урок 2 из 6

Цикл for, break и continue

В прошлом уроке счётчик цикла жил в трёх местах: начальное значение стояло перед while, условие — в скобках, а шаг $i++ — в конце тела. Цикл for собирает все три части в одну строку.

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

PHP
<?php

$total = 0;
for ($i = 1; $i <= 4; $i++) {
    $total += $i;
}
echo $total, "\n"; // 10
echo $i, "\n"; // 5

Три части заголовка

Заголовок for ($i = 1; $i <= 4; $i++) состоит из трёх частей:

  • $i = 1 выполняется один раз перед первым витком — бегун выходит на старт;
  • $i <= 4 проверяется перед каждым витком — это контрольная арка;
  • $i++ выполняется после каждого витка — это отметка в счётчике.

Давайте разберём программу по шагам:

  1. $total = 0; заводит сумму.
  2. Цикл проходит витки с $i, равным 1, 2, 3 и 4, и складывает их: $total становится 10.
  3. После четвёртого витка шаг делает $i равным 5, условие 5 <= 4 ложно, и цикл заканчивается.
  4. Два echo печатают 10 и 5.

Переменная $i не исчезает после цикла: в PHP она хранит значение, на котором условие стало ложным. for берут, когда заранее известно, откуда и докуда считать, а while — когда число витков зависит от того, что происходит в теле.

Два способа прервать виток

Иногда бегун уходит с дорожки раньше времени или срезает остаток круга. Для этого в цикле есть две инструкции. Обе пишут отдельной строкой, чаще всего внутри if.

break

break завершает весь цикл сразу, и программа продолжается со строки после цикла. Этот цикл ищет первое число больше 50, которое делится на 7:

PHP
for ($i = 51; $i <= 100; $i++) {
    if ($i % 7 === 0) {
        break;
    }
}
echo $i, "\n"; // 56

Для чисел от 51 до 55 остаток не равен нулю, и цикл идёт дальше. На 56 срабатывает break: бегун уходит с дорожки, и шаг $i++ уже не выполняется. Поэтому в $i остаётся найденное число.

break стоит внутри if, но выходит из цикла. if — не цикл, поэтому break завершает ближайший цикл или switch вокруг себя.

continue

continue пропускает только остаток текущего витка. Бегун срезает остаток круга, но отметку в счётчике всё равно делает: после continue выполняется шаг $i++, а затем проверяется условие.

PHP
for ($i = 1; $i <= 7; $i++) {
    if ($i % 3 === 0) {
        continue;
    }
    echo $i; // 12457
}
echo "\n";

Для 3 и 6 до echo дело не доходит, а остальные числа печатаются подряд: 12457. Цикл при этом идёт до конца, до 7.

Куда прыгают continue и break

Соберём обе инструкции в одну программу. Здесь ошибаются чаще всего: куда прыгает continue и что остаётся в $i после break. Нажмите «Следующий шаг» и следите за $i в рамке {main} на витках, где срабатывают continue и break.

Вживуюcontinue и break в цикле forшаг 1 из 12 · рамок: 1

$total = 0 заводит сумму.

Следите за $i на витках с continue и break

Правило, которое показывает виджет:

  • continue прыгает к шагу $i++, а потом к условию;
  • break выходит из цикла сразу, и шаг уже не выполняется;
  • после break в $i остаётся значение того витка, на котором цикл прервался.

Если циклы вложены друг в друга, break выходит только из внутреннего, а break 2 — сразу из двух.

Здесь картинка с отметкой работает только для for. В while шаг $i++ стоит в теле, и continue, написанный до него, перескакивает и через шаг. Тогда $i не меняется, и цикл повторяет тот же виток без конца.

Частая ошибка

После заголовка for поставили точку с запятой:

PHP
for ($i = 1; $i <= 3; $i++); { // ✗
    echo $i, "\n";
}

Программа печатает одну строку 4, и PHP не выдаёт никаких сообщений. Точка с запятой здесь — пустое тело: цикл пробегает три пустых круга, а блок в фигурных скобках выполняется один раз, уже после цикла. К этому моменту в $i лежит 4. Уберите ;, и цикл напечатает 1, 2 и 3.

Главное

  • В заголовке for три части: начало выполняется один раз, условие — перед каждым витком, шаг — после витка.
  • continue пропускает остаток витка, а затем выполняются шаг и проверка условия.
  • break завершает цикл сразу, и шаг $i++ уже не выполняется.
  • После цикла $i хранит последнее значение: то, на котором условие стало ложным или сработал break.