for
Цикл for в PHP: инициализация, условие и выражение приращения, перебор array, вложенные и бесконечные циклы, ошибки «на единицу».
Цикл for в PHP
for — это цикл PHP с управлением счётчиком. Он используется, когда известно — или можно вычислить — точное количество итераций: например, обход от 0 до count($array) - 1, обратный отсчёт или шаг с заданным интервалом. На этой странице рассматриваются три части заголовка цикла, порядок их выполнения, итерация array, бесконечные и вложенные циклы, альтернативный синтаксис endfor, а также ошибки «на единицу», с которыми сталкивается большинство новичков.
Если нужно пройти по каждому элементу array или object, не управляя индексом, foreach обычно подходит лучше. Для цикла, который работает до тех пор, пока условие не станет ложным, смотрите while. Общее сравнение всех типов циклов — в разделе PHP Loops.
Синтаксис
for (initialization; condition; increment) {
// code to be executed on each pass
}Заголовок содержит три выражения, разделённых точкой с запятой:
| Выражение | Когда выполняется | Типичное применение |
|---|---|---|
initialization | Один раз, перед началом цикла | Инициализация счётчика, например $i = 0 |
condition | Перед каждой итерацией | Цикл продолжается, пока значение истинно |
increment | После каждой итерации | Продвижение счётчика, например $i++ |
Порядок выполнения: запускается initialization, вычисляется condition; если оно истинно — выполняется тело, затем increment, затем снова вычисляется condition, и так далее. Как только condition становится ложным, цикл останавливается и тело не выполняется в этот последний раз.
Первый пример
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . PHP_EOL;
}
// Output:
// 1
// 2
// 3
// 4
// 5Счётчик начинается с 1. После вывода 5 выражение $i++ делает его 6, условие 6 <= 5 ложно, и цикл завершается — он выполнился ровно пять раз.
Перебор array
Классический вариант использования for — индексное обращение к array. Кэшируйте count() в переменной (или используйте слот приращения), чтобы PHP не пересчитывал array на каждом проходе:
<?php
$colors = ["red", "green", "blue"];
for ($i = 0, $n = count($colors); $i < $n; $i++) {
echo $colors[$i] . PHP_EOL;
}
// Output:
// red
// green
// blueОбратите внимание: индексы array начинаются с 0, поэтому последний допустимый индекс — count($colors) - 1. Условие использует < (а не <=) именно по этой причине — использование <= привело бы к чтению элемента за пределами array. Если нужны только значения, а не индекс, предпочтительнее foreach — он исключает весь этот класс ошибок «на единицу».
Обратный отсчёт и шаг
Выражение приращения — это просто код: оно может уменьшать значение или прыгать на любое количество:
<?php
// Count down
for ($i = 5; $i >= 1; $i--) {
echo $i . " ";
}
echo PHP_EOL;
// Output: 5 4 3 2 1
// Step by 2 (even numbers only)
for ($i = 0; $i <= 10; $i += 2) {
echo $i . " ";
}
// Output: 0 2 4 6 8 10Несколько выражений и пустые слоты
Каждый из трёх слотов может содержать несколько выражений, разделённых запятыми, а любой слот может быть пустым. Точки с запятой обязательны, даже если слоты пустые:
<?php
// Two counters moving toward each other
for ($i = 0, $j = 10; $i < $j; $i++, $j--) {
echo "$i-$j" . PHP_EOL;
}
// Output:
// 0-10
// 1-9
// 2-8
// 3-7
// 4-6Если слот условия пуст, он считается равным true, что даёт бесконечный цикл. Выход из него управляется изнутри тела с помощью break:
<?php
$i = 0;
for (;;) {
if ($i >= 3) {
break;
}
echo $i . PHP_EOL;
$i++;
}
// Output:
// 0
// 1
// 2Используйте continue, чтобы пропустить остаток текущей итерации и перейти сразу к шагу приращения.
Вложенные циклы
Размещение одного for внутри другого позволяет работать с сетками, таблицами и паттернами типа таблицы умножения. Используйте разные имена счётчиков для каждого уровня:
<?php
for ($row = 1; $row <= 3; $row++) {
for ($col = 1; $col <= 3; $col++) {
echo ($row * $col) . "\t";
}
echo PHP_EOL;
}
// Output:
// 1 2 3
// 2 4 6
// 3 6 9Внутренний цикл выполняет все свои итерации при каждом одиночном проходе внешнего цикла.
Альтернативный синтаксис endfor
PHP предлагает форму с двоеточием и endfor, которая удобна при смешивании циклов с HTML в шаблонах, поскольку позволяет избежать лишних закрывающих скобок:
<?php for ($i = 1; $i <= 3; $i++): ?>
<p>Item <?= $i ?></p>
<?php endfor; ?>Это выводит три параграфа <p>. Тот же альтернативный синтаксис существует для foreach/endforeach.
Типичные ошибки
- Ошибки «на единицу».
$i <= count($arr)обращается к несуществующему слоту (предупреждение об неопределённом индексе); используйте$i < count($arr). - Изменение длины array внутри цикла. Если тело добавляет или удаляет элементы, кэшированный
count()может устареть — пересчитайте его или переключитесь наforeach. - Случайные бесконечные циклы. Забытое приращение или сравнение в неправильном направлении (например,
$i--при условии$i < 10) означает, что условие никогда не станет ложным. - Счётчики с плавающей точкой. Шаг
0.1накапливает ошибку округления и может выйти за границу; лучше использовать целые числа в цикле и делить внутри тела.
Когда использовать for
Выбирайте for, когда количество итераций известно или вычислено заранее, и вам действительно нужен индекс (обратный отсчёт, фиксированное повторение, шаг с интервалом, построение таблиц). Когда нужно просто пройти по каждому элементу коллекции, foreach чище и безопаснее. Когда количество повторений зависит от условия, которое меняется внутри цикла, используйте while или do...while.