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!Полезное
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!Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Loops\WhileLoop;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$expected = "4\n3\n2\n1\nGo!";
$this->assertOutputOf(fn () => printCountdown(4), $expected);
}
}Решение учителя откроется через:
20:00
