for ($i = 0; $i < 5; $i++) { ... } выполняет блок фиксированное число раз. Три части это начало ($i = 0, выполняется один раз), условие ($i < 5, проверяется перед каждым проходом) и шаг ($i++, выполняется после каждого прохода). Цикл заканчивается, как только условие становится ложным.
$i существует и после цикла и хранит значение, при котором условие стало ложным (6). У переменных цикла в PHP нет блочной области видимости.
Обход массива по индексу
Для списка с ключами 0, 1, 2 ... счётчик служит и индексом. Сначала сохраните count() в переменную, чтобы она не вызывалась на каждом проходе.
Первая часть может содержать несколько выражений через запятую, так $n = count($fruits) задаётся один раз. Когда нужно только каждое значение (а не его соседи), foreach короче и работает также с массивами, ключи которых не идут от 0 до n - 1.
Обратный отсчёт и шаг больше 1
Шагом может быть любое выражение: $i-- для обратного отсчёта, $i += 2 для каждого второго числа, $i *= 2 для степеней двойки.
range('a', 'h') создаёт массив ['a', 'b', ... 'h']. С range(1, 10) и foreach получается тот же счёт, что и в цикле for, но ценой создания всего массива заранее.
break и continue
break сразу завершает цикл. continue пропускает остаток текущего прохода и переходит к шагу и следующей проверке условия.
У второго цикла пустое условие, а это значит "всегда истинно", поэтому он работает до break. Во вложенных циклах break 2 и continue 2 действуют на внешний цикл, как показывает следующий пример.
Вложенные циклы for: таблица умножения
Цикл внутри цикла полностью выполняет внутренний цикл на каждом проходе внешнего. Здесь вывод это HTML, поэтому вкладка Page показывает настоящую таблицу.
Поменяйте $size на 12 и запустите снова. Форма for (...): и endfor; это альтернативный синтаксис, который сохраняет читаемость циклов между HTML-тегами. Та же таблица в виде простого текста и с break 2, чтобы остановить оба цикла:
Частые ошибки: на единицу больше и бесконечный цикл
Две классические ошибки for: <= вместе с count() читает элемент за концом массива, что PHP сообщает как Warning: Undefined array key 3 и считает null; а шаг, который не приближает счётчик к концу ($i-- вместо $i++), оставляет условие истинным навсегда.
Для циклов, длину которых нельзя знать заранее, например чтения до конца файла, лучше подходит цикл while.
Часто задаваемые вопросы
Как обойти массив по индексу в PHP?
Для списка с ключами 0, 1, 2 используйте for ($i = 0; $i < count($arr); $i++) { echo $arr[$i]; }. В большинстве кода проще foreach ($arr as $i => $value): он даёт тот же индекс и работает, даже когда ключи не идут от 0 до n минус 1.
Как выйти из цикла for в PHP?
break; сразу покидает цикл. Во вложенных циклах break 2; выходит из внутреннего цикла и из того, что вокруг него. continue; пропускает остаток текущего прохода и переходит к следующему.
Как сделать обратный отсчёт циклом for в PHP?
Начните с большого значения, сравнивайте через >= и уменьшайте: for ($i = 10; $i >= 1; $i--) { echo $i; }. Для шага, отличного от единицы, измените третью часть, например $i += 2 или $i -= 5.
Когда использовать for вместо foreach в PHP?
Используйте for, когда что-то считаете (повторить 5 раз, числа от 1 до 100, каждый второй элемент) или нужен следующий либо предыдущий элемент по индексу. Используйте foreach, чтобы пройти каждый элемент массива, особенно ассоциативного, где числового индекса нет.