W3docs

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.

Практика

Практика
Для чего используется цикл 'for' в PHP?
Для чего используется цикл 'for' в PHP?
Was this page helpful?