Цикл for в PHP – блок-схема и урок с примерами

Циклы в PHP повторяют действия над числами, массивами и другими данными. Для диапазона со счетчиком удобно использовать for, для перебора массива – foreach. While и do-while повторяют действия, пока выполняется условие.

Как записать цикл for в PHP

Цикл for удобно использовать для перебора диапазона с заданным шагом. Например, он выводит числа от 1 до 10 или каждое второе значение. Начальное значение, условие продолжения и шаг записывают в скобках.

for (инициализация; условие; шаг) {
    // Тело цикла: повторяемые инструкции
}

Это схема синтаксиса: вместо русских обозначений подставьте PHP-выражения. Точки с запятой отделяют три части заголовка. Фигурные скобки объединяют инструкции, которые выполняются при каждом повторении.

Одно выполнение тела называют итерацией. Даже для одной инструкции используйте скобки: так проще добавлять код.

Как работает цикл for в PHP?

PHP сначала выполняет инициализацию, затем проверяет условие перед каждой итерацией. Если условие истинно, программа выполняет тело и переходит к шагу. После шага PHP снова проверяет условие.

Часть заголовкаКогда выполняетсяЗачем нужнаПример
Инициализация, expression1Один раз перед первой проверкойЗадает начальное значение счетчика$i = 1
Условие, expression2Перед каждой итерациейРазрешает продолжение или завершает цикл$i <= 10
Шаг, expression3После тела, перед следующей проверкойИзменяет счетчик$i++

Условие со значением false завершает цикл. Если первая проверка возвращает false, тело не выполняется ни разу. Шаг тоже не выполняется.

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

Пустое условие PHP трактует как истинное. Конструкция for (;;) продолжает повторение, пока код внутри не прервет выполнение.

Подробности синтаксиса описывает документация PHP по for.

Блок-схема цикла for

Блок-схема цикла for показывает возврат к проверке условия. Выход происходит по ветке false; инициализация при возврате не повторяется.

Начало
  |
  v
Инициализация (init)
  |
  v
Проверка условия <-----------------+
  |                               |
  +-- false --> Выход              |
  |                               |
 true                             |
  |                               |
  v                               |
Тело цикла                        |
  |                               |
  v                               |
Шаг (инкремент) -------------------+

Простой пример цикла for в PHP

Рассмотрим случай, когда нужно вывести на экран числа от 1 до 10 через запятую.

for ($i = 1; $i <= 10; $i++) {
    print $i . ',';
}

Инициализация $i = 1 задает первое число. Условие $i <= 10 разрешает вывод, пока счетчик не превышает 10. Шаг $i++ увеличивает счетчик на единицу после каждой итерации.

При значении 11 проверка возвращает false. Программа завершает цикл и оставляет такой результат, включая последнюю запятую:

1,2,3,4,5,6,7,8,9,10,

Чтобы выполнить пример, используйте среду с установленным PHP. Сохраните файл loops.php, добавьте первой строкой <?php и вставьте код цикла. В терминале из папки с файлом выполните php loops.php. Вы увидите последовательность из примера.

Инициализацию можно вынести перед циклом, если счетчик уже подготовлен другим кодом:

$i = 1;
for (; $i <= 10; $i++) {
    print $i . ',';
}

Шаг тоже можно перенести в тело. Такой вариант полезен, когда изменение счетчика зависит от обработки данных.

$i = 1;
for (; $i <= 10;) {
    print $i . ',';
    $i++;
}

Все три варианта выводят одинаковую последовательность.

Для обычного счетчика оставляйте шаг в заголовке: его легче заметить. Кроме того, continue может пропустить шаг, перенесенный в тело.

Сложное выражение в цикле for

Каждая часть заголовка допускает несколько выражений, разделенных запятыми. PHP вычисляет их по порядку. Это позволяет, например, изменять два счетчика одновременно.

for ($i = 1, $j = 3; $i <= 3; $i++, $j--) {
    echo $i . ':' . $j . ' ';
}

Пример выводит 1:3 2:2 3:1 . Первая переменная увеличивается, вторая уменьшается.

Если в условии несколько выражений через запятую, продолжение определяет только последнее. Запись $i < 10, $j > 0 вычисляет оба выражения, но учитывает значение $j > 0.

Для одновременной проверки двух ограничений используйте логическое И: $i < 10 && $j > 0.

В заголовке допустим и вывод через print:

for ($i = 1; $i <= 10; print $i . ',', $i++) {
    // Пустое тело: вывод перенесен в шаг
}

Здесь шаг сначала выводит число, затем увеличивает счетчик. Такой прием демонстрирует синтаксис, но ухудшает читаемость. В рабочем коде оставляйте вывод в теле цикла.

Массив и цикл for в PHP

Цикл for получает элементы массива по числовым индексам. Пример подходит для списка с последовательными ключами от 0.

$names = ['Ankur', 'John', 'Joy'];
$count = count($names);

for ($counter = 0; $counter < $count; $counter++) {
    print $names[$counter] . "\n";
}

Массив содержит 3 элемента с индексами 0, 1 и 2. Поэтому условие использует <, а не <=. Индекс 3 уже выходит за границы списка.

Вычисляйте count() перед циклом, если размер массива не меняется. Тогда PHP не вызывает функцию при каждой проверке условия.

Если тело добавляет или удаляет элементы, заранее сохраненный размер может перестать соответствовать массиву.

Также можно использовать многомерный массив в цикле for:

$names = [
    ['id' => 1, 'name' => 'Ankur'],
    ['id' => 2, 'name' => 'Joe'],
    ['id' => 3, 'name' => 'John'],
];
$count = count($names);

for ($counter = 0; $counter < $count; $counter++) {
    print 'Name ' . $names[$counter]['name']
        . ' ID ' . $names[$counter]['id'] . "\n";
}

Сначала индекс выбирает запись, затем строковый ключ выбирает ее поле. Последовательность "\n" добавляет перевод строки в терминале. Браузер обычно не отображает такой перевод как отдельную строку страницы.

Для массива с пропусками в ключах или строковыми ключами выбирайте foreach. Он обходит существующие элементы без предположений об индексах.

Цикл в цикле на примере вложенного for

Вложенный цикл выполняется внутри тела другого цикла. Такой цикл в цикле перебирает строки и столбцы двумерного массива.

$matrix = [
    [1, 2, 3],
    [2, 1, 3],
    [3, 2, 1],
];
$count = count($matrix);

for ($counter = 0; $counter < $count; $counter++) {
    $column_count = count($matrix[$counter]);
    for ($child = 0; $child < $column_count; $child++) {
        echo $matrix[$counter][$child] . ' ';
    }
    echo "\n";
}

Внешний цикл выбирает строку, внутренний перебирает ее элементы. Отдельный подсчет столбцов позволяет обрабатывать строки разной длины.

Условие внутреннего цикла может зависеть от внешнего счетчика. Например, этот код выводит треугольник из звездочек на HTML-странице:

for ($i = 1; $i <= 5; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo "*";
    }
    echo "<br>";
}

В каждой следующей строке программа добавляет одну звездочку:

*
**
***
****
*****

Внутренний счетчик $j снова получает 1 при каждом запуске внутреннего цикла.

Используйте разные переменные для уровней вложенности, чтобы не менять внешний счетчик случайно.

Инкремент в цикле for

Шаг цикла может увеличивать счетчик на любое нужное значение. Например, для нечетных чисел от 1 до 15 используйте шаг 2:

for ($counter = 1; $counter <= 15; $counter += 2) {
    print $counter . ',';
}

Программа выводит 1,3,5,7,9,11,13,15,. Запись $counter += 2 увеличивает счетчик так же, как $counter = $counter + 2.

Для обратного перебора уменьшайте счетчик и меняйте направление сравнения:

for ($i = 5; $i >= 1; $i--) {
    echo $i . ' ';
}

Результат – 5 4 3 2 1 . Оператор -- уменьшает значение на единицу; такое изменение называют декрементом.

Выход из цикла for

Оператор break завершает ближайший цикл или конструкцию switch. Используйте его, когда результат найден до окончания перебора.

Простой пример выводит элементы массива до первого значения 100:

$series = [1, 8, 5, 3, 100, 9, 7];
for ($i = 0, $count = count($series); $i < $count; $i++) {
    if (100 == $series[$i]) {
        break;
    }
    echo $series[$i] . ' ';
}

Здесь мы прерываем цикл, проверив, равно ли значение элемента массива 100.

Программа выводит 1 8 5 3 . Условие $i < $count защищает границу списка, даже если 100 отсутствует. В таком случае цикл выводит все элементы и завершается обычным способом.

Число после break задает количество прерываемых вложенных конструкций. В подсчете участвуют как циклы, так и switch:

for ($i = 0;; $i++) {
    switch ($i) {
        case 1:
            echo "This is one ";
            break 1; // Завершает только switch
        case 2:
            echo "This is two ";
            break 1; // Завершает только switch
        case 3:
            echo "This is three ";
            break 2; // Завершает switch и for
    }
}

Здесь break 1 действует так же, как обычный break. Оператор break 2 выходит из switch и окружающего for. Программа выводит This is one This is two This is three .

Если switch отсутствует, break 2 внутри двух вложенных циклов завершает оба цикла.

Использование continue в цикле for

Оператор continue пропускает оставшуюся часть текущей итерации. В цикле for PHP после этого выполняет шаг и проверяет условие.

Вспомним пример вывода нечетных чисел. Реализуем этот пример, используя continue:

for ($i = 0; $i < 20; $i++) {
    if ($i % 2 == 0) {
        continue;
    }
    echo $i . ',';
}

Условие $i % 2 == 0 находит четные числа. Для них continue пропускает вывод и передает управление шагу $i++. Затем PHP снова проверяет $i < 20.

Итоговая последовательность – 1,3,5,…,19,. Полный вывод выглядит так:

1,3,5,7,9,11,13,15,17,19,

Если изменение счетчика стоит после continue в теле, оно пропускается. Поэтому счетчик обычного for безопаснее изменять в заголовке.

Практические примеры цикла for в PHP

PHP может формировать повторяющиеся элементы HTML с помощью циклов. В шаблонах удобно использовать альтернативный синтаксис for (...): ... endfor;. Двоеточие открывает тело, а endfor; завершает его вместо фигурной скобки.

Список годов рождения

Для года рождения перебирайте годы от текущего к прошлым. Значение date('Y') преобразуйте в число перед вычислением нижней границы.

<?php $current_year = (int) date('Y'); ?>
<select name="dob_year">
    <?php for ($i = $current_year; $i >= $current_year - 100; $i--): ?>
        <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
    <?php endfor; ?>
</select>

Список содержит текущий год и предыдущие 100 лет, всего 101 вариант. Шаг $i-- исключает будущие годы из перебора.

HTML-таблица из массива

Цикл создает строку таблицы для каждой записи массива. Этот пример формирует HTML из готовых данных, без обращения к базе.

<?php
$table_data = [
    ['id' => 10001, 'name' => 'Ankur', 'country' => 'India'],
    ['id' => 20002, 'name' => 'Joy', 'country' => 'USA'],
    ['id' => 10003, 'name' => 'John', 'country' => 'UK'],
    ['id' => 20001, 'name' => 'Steve', 'country' => 'France'],
];
$count = count($table_data);
?>
<table>
    <thead>
        <tr><th>ID</th><th>Name</th><th>Country</th></tr>
    </thead>
    <tbody>
        <?php for ($i = 0; $i < $count; $i++): ?>
            <tr>
                <td><?php echo (int) $table_data[$i]['id']; ?></td>
                <td><?php echo htmlspecialchars($table_data[$i]['name'], ENT_QUOTES, 'UTF-8'); ?></td>
                <td><?php echo htmlspecialchars($table_data[$i]['country'], ENT_QUOTES, 'UTF-8'); ?></td>
            </tr>
        <?php endfor; ?>
    </tbody>
</table>

Программа формирует заголовок и 4 строки данных. Функция htmlspecialchars() экранирует специальные символы текстовых полей перед вставкой в HTML. Благодаря этому содержимое поля не превращается в разметку страницы.

Для просмотра сохраните пример в PHP-файле внутри локального проекта. В терминале из папки проекта выполните php -S localhost:8000. Если файл называется table.php, откройте в браузере http://localhost:8000/table.php. После просмотра остановите локальный сервер сочетанием Ctrl+C.

Цикл while в PHP

Цикл while проверяет условие перед каждым выполнением тела. Он подходит, когда продолжение зависит от состояния данных, а отдельный счетчик не нужен.

while (условие) {
    // Повторяемые инструкции
}

Например, программа уменьшает остаток партии, пока в ней есть элементы:

$remaining = 3;

while ($remaining > 0) {
    echo $remaining . ' ';
    $remaining--;
}

Пример выводит 3 2 1 . Если начальное значение равно 0, тело не выполняется. Изменение $remaining приближает программу к завершению.

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

Цикл do-while в PHP

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

do {
    // Повторяемые инструкции
} while (условие);

После закрывающей скобки условия ставьте точку с запятой. Это часть синтаксиса do-while.

$attempt = 1;

do {
    echo 'Попытка ' . $attempt . "\n";
    $attempt++;
} while ($attempt <= 3);

Программа выводит строки «Попытка 1», «Попытка 2» и «Попытка 3». Если задать $attempt = 4, программа все равно выведет «Попытка 4» один раз. Именно проверка после тела отличает этот цикл от while.

Цикл foreach в PHP

Для обычного перебора массива foreach проще, чем for. Он не требует count() и ручного обращения по индексам.

$names = ['Ankur', 'John', 'Joy'];

foreach ($names as $name) {
    echo $name . "\n";
}

На каждой итерации переменная $name получает очередное значение массива. Для получения ключей используйте форму ключ => значение:

$user = ['name' => 'Ankur', 'country' => 'India'];

foreach ($user as $key => $value) {
    echo $key . ': ' . $value . "\n";
}

Пример выводит name: Ankur и country: India на отдельных строках. Строковые ключи не мешают перебору.

Многомерный массив тоже можно обходить без счетчика:

$users = [
    ['id' => 1, 'name' => 'Ankur'],
    ['id' => 2, 'name' => 'Joe'],
];

foreach ($users as $user) {
    echo $user['id'] . ': ' . $user['name'] . "\n";
}

Цикл получает запись целиком, а ее поля доступны по ключам. Выбирайте for, когда задаче действительно нужны позиции или особый шаг.

Как распознать бесконечный цикл в PHP

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

У конструкции for (;;) нет завершающего условия. Если тело не содержит выхода, повторение не заканчивается самостоятельно. Не запускайте такой код без ограничения или понятного условия для break.

Неверное направление шага тоже мешает завершению. Если счетчик начинается с 1, условие $i <= 10 требует увеличения. Шаг $i-- уводит значение от верхней границы.

  • Сопоставьте начальное значение, условие и направление изменения счетчика.
  • Проверьте, выполняется ли изменение на каждой итерации, включая ветки с continue.
  • Проверьте, не присваивает ли тело счетчику начальное значение повторно.
  • Временно выведите счетчик перед проверкой проблемного участка и проследите его изменение.

Если скрипт запущен в терминале, остановите его сочетанием Ctrl+C. Исправьте условие или шаг перед повторным запуском.

Какой цикл выбрать под задачу

Выбор зависит от данных и момента проверки условия. Используйте счетчик только там, где он помогает выразить задачу.

ЦиклКогда проверяет условиеМожет не выполнить телоДля какой задачи подходит
forПеред каждой итерациейДаДиапазон чисел, заданный шаг, работа с позициями
foreachУсловия нет: идет по элементам массиваДа, если массив пустПеребор значений и ключей массива
whileПеред каждой итерациейДаПовторение, зависящее от состояния данных
do-whileПосле каждой итерацииНетОбязательная первая попытка с последующей проверкой

Для списка пользователей обычно достаточно foreach. Для каждого второго элемента по позиции подойдет for. Когда действие должно выполниться до первой проверки, используйте do-while.

Совет от нашей редакции: проверяйте новый цикл на пустом наборе и одном элементе. Эти случаи помогают заметить неверную границу и лишнюю итерацию.

Комментарии

Оставьте свой комментарий
AR
Anton R.

Помещаете этот код между блоками

здесь выводим элементы массива, например echo $page['header]

И у вас в шаблоне всё это ЦЕЛИКОМ будет как каждая итерация. Само собой всё это должно находиться в файле с расширением .php