W3docs

Цикл do-while в PHP

Узнайте, как работает цикл do-while в PHP: синтаксис, отличия от while, валидация ввода и управление потоком с break и continue.

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

Именно это отличает do-while от обычного цикла while: цикл while проверяет условие до первой итерации, поэтому тело может не выполниться ни разу. Цикл do-while проверяет условие после каждой итерации, поэтому тело всегда выполняется один раз, а затем повторяется до тех пор, пока условие остаётся истинным.

В этой главе рассматриваются синтаксис, отличия do-while от while, классический практический пример (валидация ввода), поведение break и continue внутри цикла, а также распространённая ошибка «смещения на единицу».

Синтаксис

do {
    // code to be executed each iteration
} while (condition);

Тело цикла находится внутри блока do { ... }, а condition проверяется после выполнения тела. Обратите внимание на точку с запятой после while (condition) — она обязательна (в отличие от обычного цикла while), и её пропуск является частой синтаксической ошибкой.

Порядок выполнения: тело выполняется один раз → вычисляется условие → если оно истинно, тело выполняется снова → повторяется → цикл прекращается при первом ложном значении условия.

Первый пример

Следующий код выводит числа от 1 до 10:

php— editable, runs on the server

Тело выполняется, выводит $i, увеличивает его, затем проверяется условие $i <= 10. Как только $i достигает 11, условие становится ложным и цикл завершается, поэтому выводятся цифры от 1 до 10.

do-while против while: ключевое отличие

Тело цикла do-while всегда выполняется хотя бы один раз, даже если условие изначально ложно. Цикл while, напротив, может выполниться ноль раз. Сравните:

<?php

// do-while: body runs once, THEN the condition is checked
$x = 100;
do {
    echo "do-while ran\n";
} while ($x < 10);

// while: condition checked first, so the body never runs
$y = 100;
while ($y < 10) {
    echo "while ran\n";
}

// Output:
// do-while ran

Несмотря на то что 100 < 10 ложно в обоих случаях, тело do-while всё равно выполнилось один раз. Используйте do-while, когда логика задачи соответствует принципу «выполнить, а затем решить, повторять ли».

Практический пример: валидация ввода

Поведение «выполнить хотя бы один раз» идеально подходит для запроса ввода от пользователя (или повтора операции) до получения приемлемого результата — вам всегда нужна хотя бы одна попытка, прежде чем появится что-то для проверки:

<?php

$attempts = 0;
$pin = "";

do {
    $attempts++;
    // In real code this would read from input; we simulate the attempts:
    $pin = ["123", "0000", "4821"][$attempts - 1];
    echo "Attempt $attempts: tried '$pin'\n";
} while ($pin !== "4821" && $attempts < 3);

echo $pin === "4821" ? "Access granted\n" : "Locked out\n";

// Output:
// Attempt 1: tried '123'
// Attempt 2: tried '0000'
// Attempt 3: tried '4821'
// Access granted

Цикл продолжается до тех пор, пока не введён правильный PIN-код или не исчерпан лимит попыток — при этом нет необходимости в отдельной «первой попытке» перед циклом.

break и continue

break немедленно завершает цикл, а continue переходит к проверке условия (следующей итерации):

<?php

$i = 0;
do {
    $i++;
    if ($i === 3) {
        continue; // skip printing 3
    }
    if ($i > 5) {
        break;    // stop entirely
    }
    echo $i;
} while (true);

// Output: 1245

3 пропускается с помощью continue, а break останавливает цикл после 5, поэтому выводятся 1, 2, 4, 5.

Распространённая ошибка: смещение на единицу

Поскольку do-while выполняется до проверки условия, «пустое» условие всё равно даёт одну итерацию. Если вы обрабатываете коллекцию, которая может быть пустой, предпочтите foreach или while — цикл do-while сначала обработает один несуществующий элемент:

<?php

$items = []; // empty!
$index = 0;
do {
    echo "Processing item $index\n"; // runs once even though there are no items
    $index++;
} while ($index < count($items));

// Output: Processing item 0

Используйте do-while только тогда, когда «хотя бы один раз» действительно является нужным поведением.

Блок-схема

graph LR
A[Start] --> B[Execute code block]
B --> C[Check condition]
C --> D{Is condition true?}
D --Yes--> B
D --No--> E[End]

Связанные главы

  • Цикл while в PHP — сначала проверяет условие; тело может выполниться ноль раз.
  • Цикл for в PHP — лучший выбор, когда количество итераций известно заранее.
  • Цикл foreach в PHP — идиоматический способ перебора array.
  • break / continue в PHP — управление потоком выполнения цикла.

Практика

Практика
Каково поведение и назначение цикла 'do-while' в PHP?
Каково поведение и назначение цикла 'do-while' в PHP?
Was this page helpful?