Цикл for, break и continue
В прошлом уроке счётчик цикла жил в трёх местах: начальное значение стояло перед while, условие — в скобках, а шаг $i++ — в конце тела. Цикл for собирает все три части в одну строку.
На беговой дорожке это линия старта, контрольная арка перед каждым кругом и отметка в счётчике после круга. В заголовке for они стоят рядом, через точку с запятой:
<?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++выполняется после каждого витка — это отметка в счётчике.
Давайте разберём программу по шагам:
$total = 0;заводит сумму.- Цикл проходит витки с
$i, равным1,2,3и4, и складывает их:$totalстановится10. - После четвёртого витка шаг делает
$iравным5, условие5 <= 4ложно, и цикл заканчивается. - Два
echoпечатают10и5.
Переменная $i не исчезает после цикла: в PHP она хранит значение, на котором условие стало ложным. for берут, когда заранее известно, откуда и докуда считать, а while — когда число витков зависит от того, что происходит в теле.
Два способа прервать виток
Иногда бегун уходит с дорожки раньше времени или срезает остаток круга. Для этого в цикле есть две инструкции. Обе пишут отдельной строкой, чаще всего внутри if.
break
break завершает весь цикл сразу, и программа продолжается со строки после цикла. Этот цикл ищет первое число больше 50, которое делится на 7:
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++, а затем проверяется условие.
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.
1<?php2 3$total = 0;4for ($i = 1; $i <= 5; $i++) {5 if ($i === 3) {6 continue;7 }8 if ($i === 5) {9 break;10 }11 $total += $i;12}13echo $total, ' ', $i, "\n";
$total = 0 заводит сумму.
Правило, которое показывает виджет:
continueпрыгает к шагу$i++, а потом к условию;breakвыходит из цикла сразу, и шаг уже не выполняется;- после
breakв$iостаётся значение того витка, на котором цикл прервался.
Если циклы вложены друг в друга, break выходит только из внутреннего, а break 2 — сразу из двух.
Здесь картинка с отметкой работает только для for. В while шаг $i++ стоит в теле, и continue, написанный до него, перескакивает и через шаг. Тогда $i не меняется, и цикл повторяет тот же виток без конца.
Частая ошибка
После заголовка for поставили точку с запятой:
for ($i = 1; $i <= 3; $i++); { // ✗
echo $i, "\n";
}Программа печатает одну строку 4, и PHP не выдаёт никаких сообщений. Точка с запятой здесь — пустое тело: цикл пробегает три пустых круга, а блок в фигурных скобках выполняется один раз, уже после цикла. К этому моменту в $i лежит 4. Уберите ;, и цикл напечатает 1, 2 и 3.
Главное
- В заголовке
forтри части: начало выполняется один раз, условие — перед каждым витком, шаг — после витка. continueпропускает остаток витка, а затем выполняются шаг и проверка условия.breakзавершает цикл сразу, и шаг$i++уже не выполняется.- После цикла
$iхранит последнее значение: то, на котором условие стало ложным или сработалbreak.