Цикл while и do-while в PHP 8.2: подробное руководство
Цикл while и do-while в PHP 8.2
Введение: Зачем нужны циклы?
Представь, что тебе нужно 100 раз написать на доске: «Я буду программировать отлично!». Будешь писать это вручную 100 раз? Конечно нет! В программировании для таких повторяющихся действий существуют циклы. Они позволяют выполнять один и тот же блок кода много раз, пока выполняется какое-то условие.
В этом разделе мы познакомимся с двумя видами циклов: while и do-while. Они очень похожи, но есть одно важное отличие.
Цикл while: «Проверяй, потом делай»
Цикл while работает так: сначала он проверяет условие. Если условие верно (true), он выполняет код внутри фигурных скобок {}. После этого снова проверяет условие. И так до тех пор, пока условие не станет ложным (false).
Синтаксис:
<?php
while (условие) {
// код, который будет повторяться
// здесь обязательно нужно менять переменные, влияющие на условие
// иначе цикл станет бесконечным!
}
?>
Пример 1: Простой счетчик
Выведем числа от 1 до 5:
<?php
$count = 1; // Начальное значение
while ($count <= 5) {
echo "Число: $count\n"; // Выводим текущее число
$count++; // Увеличиваем счетчик на 1 (это важно!)
}
?>
Результат работы:
Число: 1
Число: 2
Число: 3
Число: 4
Число: 5
Важно! Если забыть строчку $count++, то значение $count всегда будет равно 1, условие 1 <= 5 всегда будет истинным, и цикл будет работать бесконечно. Компьютер зависнет!
Цикл do-while: «Сделай, потом проверяй»
Цикл do-while отличается тем, что он сначала выполняет код, а потом проверяет условие. Это гарантирует, что код внутри цикла выполнится хотя бы один раз, даже если условие изначально ложно.
Синтаксис:
<?php
do {
// код, который выполнится хотя бы один раз
} while (условие);
?>
Обрати внимание на точку с запятой ; в конце после while — это обязательное требование синтаксиса!
Пример 2: Сравнение while и do-while
Допустим, мы хотим спрашивать у пользователя число, пока он не введёт 0. Сначала используем do-while, потому что нам нужно хотя бы один раз запросить ввод:
<?php
$number = 0;
do {
echo "Введите число (0 для выхода): ";
$handle = fopen ("php://stdin","r");
$number = (int) fgets($handle);
fclose($handle);
if ($number !== 0) {
echo "Вы ввели: $number. Продолжаем...\n";
}
} while ($number !== 0);
echo "Программа завершена!";
?>
Пример работы (пользователь вводит 5, потом 3, потом 0):
Введите число (0 для выхода): 5
Вы ввели: 5. Продолжаем...
Введите число (0 для выхода): 3
Вы ввели: 3. Продолжаем...
Введите число (0 для выхода): 0
Программа завершена!
Разбор типичных задач
Давай разберём, как решать задачи, похожие на те, что будут в этом разделе.
Задача: Робот-шахтёр
Робот начинает с 0 энергии. Каждый кристалл даёт случайное количество энергии от 5 до 20. Нужно собирать кристаллы, пока энергия не станет >= 100.
<?php
$energy = 0;
$crystalsCollected = 0;
while ($energy < 100) {
// Находим кристалл (генерируем случайное число)
$crystalPower = rand(5, 20);
$energy += $crystalPower; // Добавляем энергию
$crystalsCollected++;
echo "Собран кристалл №$crystalsCollected с энергией $crystalPower. Всего энергии: $energy\n";
}
echo "Сумка полна! Собрано $crystalsCollected кристаллов. Итоговая энергия: $energy\n";
?>
Результат (примерный):
Собран кристалл №1 с энергией 12. Всего энергии: 12
Собран кристалл №2 с энергией 18. Всего энергии: 30
Собран кристалл №3 с энергией 7. Всего энергии: 37
Собран кристалл №4 с энергией 15. Всего энергии: 52
Собран кристалл №5 с энергией 20. Всего энергии: 72
Собран кристалл №6 с энергией 10. Всего энергии: 82
Собран кристалл №7 с энергией 19. Всего энергии: 101
Сумка полна! Собрано 7 кристаллов. Итоговая энергия: 101
Задача: Обратный отсчёт
Доктор Вэнс запускает машину времени с координаты n. Каждую секунду координата уменьшается на 1. Нужно вывести все значения до 0.
<?php
echo "Введите начальную временную координату: ";
$handle = fopen ("php://stdin","r");
$n = (int) fgets($handle);
fclose($handle);
$current = $n;
while ($current >= 0) {
echo "Текущая координата: $current\n";
$current--; // Уменьшаем на 1
}
echo "Машина времени остановилась!\n";
?>
Пример работы (ввод 3):
Введите начальную временную координату: 3
Текущая координата: 3
Текущая координата: 2
Текущая координата: 1
Текущая координата: 0
Машина времени остановилась!
Частые ошибки новичков
- Бесконечный цикл. Самая популярная ошибка. Всегда проверяй, что внутри цикла ты изменяешь переменную, которая влияет на условие. Если условие никогда не станет ложным — программа зависнет.
- Забытая точка с запятой в do-while. После
while (условие)в циклеdo-whileобязательно ставить точку с запятой. Без неё будет ошибка синтаксиса. - Путаница между while и do-while. Если нужно, чтобы код выполнился хотя бы один раз (например, запросить ввод у пользователя), используй
do-while. Если действие может не понадобиться вообще — используйwhile. - Неверное условие. Проверяй знаки:
<(меньше),>(больше),<=(меньше или равно),!=(не равно). Ошибка в знаке приводит к неправильным результатам.
Итоговый пример: Волшебная экспедиция
Представь, что ты нашёл Артефакт Силы. Он начинает светиться с силой 1 единица. Каждую секунду его сила увеличивается в 2 раза. Когда сила достигнет 1000 или больше, артефакт активируется. Сколько секунд это займёт?
<?php
$power = 1;
$seconds = 0;
echo "Артефакт начинает светиться...\n";
while ($power < 1000) {
$seconds++;
$power *= 2; // Увеличиваем силу вдвое
echo "Секунда $seconds: сила артефакта = $power\n";
}
echo "Артефакт активировался через $seconds секунд! Сила: $power\n";
?>
Результат работы:
Артефакт начинает светиться...
Секунда 1: сила артефакта = 2
Секунда 2: сила артефакта = 4
Секунда 3: сила артефакта = 8
Секунда 4: сила артефакта = 16
Секунда 5: сила артефакта = 32
Секунда 6: сила артефакта = 64
Секунда 7: сила артефакта = 128
Секунда 8: сила артефакта = 256
Секунда 9: сила артефакта = 512
Секунда 10: сила артефакта = 1024
Артефакт активировался через 10 секунд! Сила: 1024
Краткое резюме
- while — проверяет условие перед каждым выполнением. Может не выполниться ни разу.
- do-while — выполняет код, а потом проверяет условие. Выполняется минимум один раз.
- Всегда изменяй переменные внутри цикла, чтобы избежать бесконечного выполнения.
- Используй
echoдля вывода результатов,fgets(STDIN)для чтения ввода.
Теперь ты готов решать задачи с циклами while и do-while! Помни: практика — лучший способ научиться программировать. Удачи в твоих приключениях!