PHP: Цикл While

Помимо условных конструкций, в программировании невозможно обойтись без циклов. Это специальный механизм, позволяющий выполнять любое действие многократно. На его базе строятся практически любые вычисления — от подсчета среднего балла в группе до обработки входящих запросов на сайтах.

Цикл хранит повторяющееся действие в одном месте и запускает его снова, пока условие остается истинным.

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

Пусть программа должна пять раз вывести строку Hello!. Чтобы остановить повторение в нужный момент, программе нужна переменная, которая хранит номер текущего шага. Такую переменную обычно называют счетчиком.

В примере счетчик называется $counter. Перед циклом он равен 0. После каждого вывода строки мы увеличиваем его на единицу.

<?php

$counter = 0;
while ($counter < 5) {
    print_r("Hello!\n");
    $counter = $counter + 1;
}

// => Hello!
// => Hello!
// => Hello!
// => Hello!
// => Hello!

Теперь цикл может проверять значение счетчика перед каждым повтором. Пока $counter < 5, выполняется код в фигурных скобках после while. Такой блок называют телом цикла.

После выполнения тела интерпретатор возвращается к условию и проверяет его заново. Пока условие истинно, цикл продолжается. Когда условие становится ложным (false), программа выходит из цикла и выполняет следующий код.

Без изменения счетчика условие никогда не станет ложным, и цикл превратится в бесконечный. Со стороны это выглядит так, как будто программа зависла.

Работа цикла по шагам

Перед первым повтором $counter равен 0.

Шаг 1. Интерпретатор проверяет $counter < 5. Значение 0 меньше 5, поэтому выполняется тело цикла. На экран выводится Hello!, а $counter увеличивается до 1.

Шаг 2. Интерпретатор снова проверяет условие. Значение 1 все еще меньше 5, поэтому тело цикла выполняется еще раз. На экран снова выводится Hello!, а $counter увеличивается до 2.

Так продолжается, пока $counter не станет равен 5. При следующей проверке условие $counter < 5 будет ложным, поэтому цикл завершится. Дальше программа выполнит код после цикла.

Та же последовательность на схеме.

$counter = 0
┌──→ $counter < 5?
│     true │
│          ↓
│    print_r("Hello!\n")
│    $counter = $counter + 1
└──────────┘
      false → выход из цикла

После завершения цикла $counter равен 5, а строка Hello! напечатана пять раз.

Тело цикла и продолжение программы

К телу цикла относятся все строки внутри фигурных скобок после while. Когда закрывающая скобка заканчивает блок, заканчивается и цикл.

<?php

$counter = 0;
while ($counter < 2) {
    print_r("Hello!\n");
    $counter = $counter + 1;
}

print_r("End of loop\n");

В этом примере print_r("Hello!\n") и $counter = $counter + 1 находятся внутри цикла. Строка print_r("End of loop\n") стоит после закрывающей скобки, поэтому выполнится один раз после завершения цикла.

По фигурным скобкам PHP понимает, какие строки нужно повторять, а какие идут дальше по программе.

Цикл внутри функции

Теперь перенесем цикл в функцию. Она напечатает числа от 1 до переданного значения.

<?php

function printNumbers(int $n): void
{
    $i = 1;
    while ($i <= $n) {
        print_r($i . "\n");
        $i = $i + 1;
    }
    print_r("Finished!\n");
}

printNumbers(3);
// => 1
// => 2
// => 3
// => Finished!

Цикл while печатает числа, пока $i не станет больше $n. После этого программа выходит из цикла и выполняет print_r("Finished!\n").

Условие и изменение счетчика зависят от задачи. Счетчик можно увеличивать на 1, на 2 или сразу на 10. Его можно уменьшать, если цикл идет от большего значения к меньшему. Можно менять счетчик не на каждом повторе, а через один или после выполнения дополнительной проверки. Главное, чтобы условие когда-нибудь стало ложным. Иначе цикл будет работать бесконечно.

Задание

Напишите функцию printCountdown(), которая имитирует обратный отсчет перед стартом. Функция принимает количество секунд и печатает числа от этого значения до 1.

После завершения отсчета функция должна вывести на экран строку Go!.

<?php

printCountdown(4);
// => 4
// => 3
// => 2
// => 1
// => Go!

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются