PHP do while и цикл while: примеры и правила
Что такое while в PHP? Это цикл, который повторяет тело, пока условие возвращает true. Цикл while PHP проверяет условие до первой итерации, а php do while выполняет тело хотя бы один раз. Разберем синтаксис, выбор конструкции, break, continue и практические шаблоны без зацикливания.
Что такое while в PHP
Цикл while сначала проверяет условие. Если оно возвращает true, PHP выполняет тело и снова проверяет выражение. Полное описание конструкции есть в документации PHP о while.
<?php
while (condition) {
// инструкции
}
?>Условие обычно зависит от счетчика, элемента массива или результата вызова метода.
<?php
$i = 0;
while ($i < 10) {
echo "$i, ";
$i++;
}
?>Переменная $i начинается со значения 0. После каждого вывода счетчик увеличивается на 1.
Когда $i достигает значения 10, выражение $i < 10 возвращает false. Цикл прекращает работу.
Если тело не меняет данные из условия, цикл зациклится. В веб-окружении PHP обычно останавливает такой скрипт после лимита max_execution_time, который по умолчанию равен 30 секундам. В CLI значение по умолчанию равно 0, поэтому бесконечный цикл может продолжаться без ограничения времени.
Подробности описаны в документации PHP о max_execution_time.
Несколько условий и счетчиков
Оператор while принимает составное условие. Обновляйте оба счетчика внутри тела, иначе одна часть выражения может навсегда остаться истинной.
<?php
$counter1 = 0;
$counter2 = 0;
$min = -20;
$max = 30;
while ($counter1 < $max && $counter2 > $min) {
echo "counter1: $counter1; counter2: $counter2<br>";
$counter1 += 2;
$counter2 -= 3;
}
?>Первый счетчик растет на 2, второй уменьшается на 3. Цикл завершится, когда хотя бы одно из двух условий станет ложным.
Альтернативный синтаксис while
В PHP-вставках внутри HTML фигурные скобки можно заменить конструкцией while ... endwhile. Такая запись отделяет управляющий код от HTML-разметки.
<?php $i = 0; ?>
<?php while ($i < 3): ?>
<p>Строка <?= $i ?></p>
<?php $i++; ?>
<?php endwhile; ?>Форма меняет только запись конструкции. Правило выхода остается прежним: счетчик должен достичь значения, при котором условие станет ложным.
Как выбрать между while, do-while и for
Три цикла решают похожие задачи, но по-разному управляют проверкой. Сравните момент проверки, минимальное число запусков и типичный сценарий.
| Цикл | Когда проверяется условие | Минимум выполнений тела | Типичный случай |
|---|---|---|---|
while | До тела | 0 | Чтение данных, пока они доступны |
do-while | После тела | 1 | Повтор запроса или попытки после первого запуска |
for | До тела | 0 | Счетчик с известными началом и шагом |
Берите while, когда число повторов заранее неизвестно. Выбирайте do-while, когда первая попытка нужна при любом результате. Используйте for, когда инициализацию, условие и шаг удобно держать в одной строке.
<?php
for ($i = 0; $i < 3; $i++) {
echo "$i, ";
}
?>В этом примере for объединяет счетчик, условие и шаг. Такой формат удобен для трех повторов с одинаковым интервалом.
Практические шаблоны while в PHP
В рабочем коде while связывают с источником данных или явным условием завершения. Выбирайте шаблон по тому, откуда приходит следующая итерация.
Чтение строк из результата запроса
Метод fetch() возвращает следующую строку результата. Когда строки заканчиваются, условие становится ложным.
<?php
while ($row = $stmt->fetch()) {
echo htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
}
?>Цикл обрабатывает одну строку за проход и не требует отдельного счетчика.
Бесконечный цикл с явным break
Запись while (true) подходит, когда условие завершения появляется внутри тела. Без break такая конструкция не остановится.
<?php
while (true) {
$line = trim(fgets(STDIN));
if ($line === '') {
break;
}
echo "Получено: $line\n";
}
?>Пустая строка завершает чтение. Внешнее условие не требуется, потому что выход явно задан внутри цикла.
Перебор массива или очереди
Для очереди извлекайте обработанный элемент. Тогда условие проверяет, остались ли элементы.
<?php
$queue = ['first', 'second', 'third'];
while ($queue) {
$item = array_shift($queue);
echo "$item\n";
}
?>Каждый вызов array_shift() убирает первый элемент. Когда массив становится пустым, цикл заканчивается.
Влияние ключевых слов break и continue на цикл
break полностью выходит из текущего цикла. continue прекращает текущую итерацию и передает управление следующей проверке условия. Синтаксис обоих операторов описан в официальной документации PHP: break и continue.
Остановка цикла через break
Проверяйте значение до изменения счетчика, если нужно остановиться на конкретном числе.
<?php
$max = 30;
$count = 0;
$increment = 2;
while ($count < $max) {
if ($count == 10) {
echo "Останавливаемся на числе 10";
break;
}
echo "$count, ";
$count += $increment;
}
?>Цикл выводит числа от 0 до 8 с шагом 2. При значении $count, равном 10, PHP выполняет break и покидает цикл.
Пропуск итерации через continue
Инкремент ставьте до continue, если счетчик должен измениться на каждой итерации.
<?php
$max = 30;
$count = 0;
$increment = 2;
while ($count < $max) {
$count += $increment;
if ($count >= 10 && $count <= 15) {
continue;
}
echo "$count<br>";
}
?>Инкремент стоит в начале тела, поэтому 0 не выводится. Условие пропускает 10, 12 и 14, а на экран попадают 2, 4, 6, 8, 16, 18, 20, 22, 24, 26, 28 и 30.
Ловушка с инкрементом после continue
В таком варианте счетчик не изменится, когда условие пропуска станет истинным. Цикл навсегда останется на значении 10.
<?php
$count = 0;
while ($count < 20) {
if ($count >= 10) {
continue;
}
$count++;
}
?>Поставьте изменение счетчика перед continue или перенесите проверку после инкремента. Иначе тело снова начнется с того же значения.
break и continue во вложенных циклах
Во вложенной конструкции обычный break или continue действует только на внутренний цикл. Число после ключевого слова меняет уровень вложенности.
<?php
$row = 0;
while ($row < 3) {
$column = 0;
while ($column < 3) {
if ($row == 1 && $column == 1) {
break 2;
}
echo "$row:$column<br>";
$column++;
}
$row++;
}
?>Команда break 2 выходит из внутреннего и внешнего циклов. Последняя выведенная пара – 1:0, потому что на проверке 1:1 срабатывает break 2 до команды echo.
<?php
$row = 0;
while ($row < 3) {
$column = 0;
while ($column < 3) {
$column++;
if ($column == 2) {
$row++;
continue 2;
}
echo "$row:$column<br>";
}
$row++;
}
?>Перед continue 2 внешний счетчик получает новое значение. Команда пропускает остаток внутреннего цикла и запускает следующую итерацию внешнего.
| Ключевое слово | Действие |
|---|---|
break | Выходит из текущего цикла |
continue | Переходит к следующей проверке условия |
php do while: синтаксис и примеры
Конструкция do-while проверяет условие после тела. Поэтому тело запускается минимум 1 раз, даже если условие сразу ложно. Подробный синтаксис приведен в документации PHP о do-while.
<?php
do {
// инструкции
} while (condition);
?>Повтор генерации до подходящего результата
Такой цикл подходит, когда результат нужно получить до проверки. Для учебного примера используйте rand(), а для криптостойких случайных чисел – random_int().
<?php
do {
$random = rand(0, 30);
} while ($random > 10 && $random < 20);
echo "Наше случайное число: $random";
?>Первое число появляется внутри тела. Если оно попало в диапазон от 11 до 19, PHP повторяет генерацию.
Повтор запроса с ограничением попыток
Ограничение итераций защищает код от бесконечного ожидания. Счетчик попыток меняйте на каждой итерации.
<?php
$attempt = 0;
$valid = false;
do {
$attempt++;
$valid = checkResult();
} while (!$valid && $attempt < 3);
if ($valid) {
echo 'Результат принят';
}
?>Функция checkResult() в примере должна вернуть логическое значение. Цикл завершится после успешного результата или после трех попыток.
После do-while ставьте точку с запятой. Это отличие от конструкции while с фигурными скобками.
Как написать while без зацикливания
Перед запуском проверьте пять вещей: условие выхода, изменение данных, лимит попыток, работу continue и уровень выхода. Каждая итерация должна приближать состояние к завершению.
- Назовите условие выхода. Запишите, при каком значении цикл должен закончиться.
- Изменяйте переменную условия. Счетчик, очередь или указатель должны двигаться внутри тела.
- Ограничьте внешние попытки. Для сети, генерации и повторных запросов добавьте максимум итераций.
- Проверьте continue. Код до него должен менять состояние, иначе итерация может повториться бесконечно.
- Выберите нужный уровень выхода. Во вложенном цикле используйте
break 2илиcontinue 2только при переходе через два уровня.
Совет от нашей редакции: для простого счетчика выбирайте for, для чтения потока – while, а для обязательной первой попытки – do-while.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- Как сделать редирект на PHP 6 мин чтения
- Основы ООП в PHP: принципы и примеры 6 мин чтения
- Адаптивный помесячный календарь на AJAX и PHP 2 мин чтения
- Как создать формы регистрации и авторизации на PHP 5 мин чтения
Комментарии