Цикл for в PHP – блок-схема и урок с примерами
Циклы в PHP повторяют действия над числами, массивами и другими данными. Для диапазона со счетчиком удобно использовать for, для перебора массива – foreach. While и do-while повторяют действия, пока выполняется условие.
- Как записать цикл for в PHP
- Как работает цикл for в PHP?
- Блок-схема цикла for
- Простой пример цикла for в PHP
- Сложное выражение в цикле for
- Массив и цикл for в PHP
- Цикл в цикле на примере вложенного for
- Инкремент в цикле for
- Выход из цикла for
- Использование continue в цикле for
- Практические примеры цикла for в PHP
- Цикл while в PHP
- Цикл do-while в PHP
- Цикл foreach в PHP
- Как распознать бесконечный цикл в PHP
- Какой цикл выбрать под задачу
Как записать цикл 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.
Совет от нашей редакции: проверяйте новый цикл на пустом наборе и одном элементе. Эти случаи помогают заметить неверную границу и лишнюю итерацию.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- Как сделать редирект на PHP 6 мин чтения
- Основы ООП в PHP: принципы и примеры 6 мин чтения
- Адаптивный помесячный календарь на AJAX и PHP 2 мин чтения
- Как создать формы регистрации и авторизации на PHP 5 мин чтения
Комментарии
Помещаете этот код между блоками
здесь выводим элементы массива, например echo $page['header]
И у вас в шаблоне всё это ЦЕЛИКОМ будет как каждая итерация. Само собой всё это должно находиться в файле с расширением .php