🐘 PHP

Цикл 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! Помни: практика — лучший способ научиться программировать. Удачи в твоих приключениях!