Циклы PHP и оператор break
Операторы break и continue в PHP позволяют управлять выполнением циклов: прерывать их досрочно или пропускать итерации.
Когда вы пишете цикл в PHP, вам часто нужен более тонкий контроль, чем просто «выполнить каждую итерацию». Два оператора дают такой контроль: break досрочно завершает цикл, а continue пропускает оставшуюся часть текущей итерации. На этой странице рассматриваются оба оператора, включая их применение во вложенных циклах с помощью break N и continue N.
Понимание оператора break
Оператор break немедленно завершает текущий цикл (или switch) и передаёт управление первому оператору после цикла. Используйте его, когда вы нашли то, что искали, или когда продолжение было бы бессмысленным или небезопасным — например, после обнаружения совпадающей записи или при возникновении ошибки.
break работает внутри циклов for, foreach, while и do...while, а также внутри оператора switch.
Примечание: Использование
breakза пределами цикла или оператораswitchвызывает фатальную ошибку в PHP.
Использование оператора break в цикле for
В цикле for оператор break позволяет остановить цикл при выполнении определённого условия. Например, следующий код использует цикл for для поиска числа в array:
Пример PHP: break в цикле for
В этом коде цикл остановится, как только значение $numbers[$i] станет равным 3. Вывод этого кода будет "Found 3 at index 2".
Использование оператора break в цикле foreach
В цикле foreach оператор break работает аналогично циклу for. Следующий код использует цикл foreach для поиска конкретного значения в ассоциативном array:
Пример PHP: break в цикле foreach
В этом коде цикл остановится, как только ключ $color станет равным "green". Вывод этого кода будет "green has hex code #00FF00".
Выход из вложенных циклов
Оператор break также можно использовать для выхода из вложенных циклов. Когда оператор break используется внутри вложенного цикла, завершается только самый внутренний цикл.
Например, следующий код использует два вложенных цикла для поиска конкретного значения в двумерном array:
Пример PHP: break во вложенных циклах
В этом коде оператор break 2 используется для выхода из двух уровней вложенности. Вывод этого кода будет Found 5 at [1][1].
Число после break — это количество уровней вложенности, из которых нужно выйти, а не индекс цикла. break 1 эквивалентен простому break, и число не может быть больше фактической глубины вложенности.
Понимание оператора continue
Там, где break полностью выходит из цикла, continue только пропускает оставшуюся часть текущей итерации и сразу переходит к следующей. Сам цикл продолжает выполняться. Это естественный выбор, когда нужно проигнорировать некоторые элементы, но всё равно обработать все остальные.
Следующий цикл выводит все числа от 1 до 10, кроме чётных:
Пример PHP: continue в цикле for
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 == 0) {
continue; // skip even numbers
}
echo "$i ";
}
?>Вывод: 1 3 5 7 9 — когда $i чётное, continue пропускает echo, и цикл переходит к следующему значению.
Continue в цикле foreach
continue особенно удобен в цикле foreach, когда нужно фильтровать элементы по ходу перебора. Здесь мы пропускаем любой товар, которого нет в наличии:
Пример PHP: continue в цикле foreach
<?php
$products = array(
array("name" => "Pen", "stock" => 12),
array("name" => "Notebook", "stock" => 0),
array("name" => "Eraser", "stock" => 5),
);
foreach ($products as $product) {
if ($product["stock"] === 0) {
continue; // don't list sold-out items
}
echo $product["name"] . " (" . $product["stock"] . " in stock)\n";
}
?>Этот код выводит Pen и Eraser, пропуская отсутствующий в наличии Notebook.
Пропуск нескольких уровней с помощью continue N
Аналогично break N, оператор continue N переходит к следующей итерации внешнего цикла. Например, continue 2 перезапускает цикл на один уровень выше:
Пример PHP: continue 2 во вложенных циклах
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
if ($j == 2) {
continue 2; // jump to the next $i
}
echo "i=$i j=$j\n";
}
}
?>Внутренний цикл всегда выводит только j=1, потому что при достижении j == 2 перезапускается внешний цикл. Вывод: i=1 j=1, i=2 j=1, i=3 j=1.
Break и Continue: сравнение
| Оператор | Действие |
|---|---|
break | Полностью останавливает цикл; выполнение продолжается после цикла. |
continue | Пропускает оставшуюся часть текущей итерации; цикл продолжается. |
break N | Выходит сразу из N вложенных циклов. |
continue N | Переходит к следующей итерации цикла на N уровней выше. |
Частые ошибки
continueв циклеdo...whileвсё равно проверяет условие. Он не пропускает проверку условия, поэтому цикл всё равно может завершиться послеcontinue.continueведёт себя иначе внутриswitch. Внутриswitch, расположенного в цикле,continueдействует какbreakдляswitchи выдаёт предупреждение в современных версиях PHP. Используйтеbreakдля выхода изswitch, аcontinueоставьте для окружающего цикла.- Ошибка на единицу с
continueв циклеforредка, потому что шаг циклаforвыполняется в штатном режиме — но в циклеwhileвы должны обновлять счётчик передcontinue, иначе можно создать бесконечный цикл.
Заключение
Операторы break и continue дают точный контроль над выполнением цикла: break досрочно завершает цикл, а continue пропускает итерацию и продолжает выполнение. Формы break N и continue N расширяют этот контроль на вложенные циклы. Далее изучите, как работают различные типы циклов — for, foreach, while и do...while.