for

(PHP 4, PHP 5, PHP 7, PHP 8)

Цикл for самый сложный цикл в PHP. Цикл ведёт себя аналогично языку C. Синтаксис цикла for выглядит вот так:

for (expr1; expr2; expr3)
    statement

Первое выражение expr1 вычисляется или выполняется только один раз безусловно в начале цикла.

В начале каждой итерации оценивается выражение expr2. Цикл продолжается, а вложенные инструкции выполняются, если выражение принимает значение true. Выполнение цикла заканчивается, если выражение принимает значение false.

В конце каждой итерации вычисляется или выполняется выражение expr3.

Каждое из выражений разрешается оставлять пустым или указывать в каждом выражении набор выражений через запятую. В части expr2 каждое выражение, которое отделили запятой, вычисляется, но результат берётся из последнего. Цикл выполняется бесконечно, если выражение expr2 оставили пустым; PHP неявно рассматривает пустое выражение как значение true, по аналогии с языком C. Это бывает не так бесполезно, как кажется, поскольку вместо выражения истинности в списке выражений цикла for цикл часто требуется прервать по условию в теле цикла путём вызова инструкции break.

Рассмотрим следующие примеры. Каждый пример выводит числа от 1 до 10:

<?php

/* Пример 1 */

for ($i = 1; $i <= 10; $i++) {
echo
$i;
}

/* Пример 2 */

for ($i = 1; ; $i++) {
if (
$i > 10) {
break;
}

echo
$i;
}

/* Пример 3 */

$i = 1;
for (; ; ) {
if (
$i > 10) {
break;
}

echo
$i;
$i++;
}

/* Пример 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);

?>

Конечно, первый пример кажется самым красивым (или, возможно, четвёртый), но программисты часто находят пустые выражения в циклах for удобными.

PHP также поддерживает для циклов for альтернативный синтаксис с двоеточием.

for (expr1; expr2; expr3):
    statement
    ...
endfor;

Следующий пример перебирает массивы стандартным способом, к которому привыкли разработчики.

<?php

/**
* Это массив с данными, которые требуется изменить
* в цикле
*/
$people = array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for (
$i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}

?>

Приведённый код иногда работает медленно, поскольку размер массива вычисляется в каждой итерации. Поскольку размер не меняется, цикл легко оптимизируется через промежуточную переменную, в которую записывается размер массива, вместо повторяющихся вызовов функции count():

<?php

$people
= array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for(
$i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}

?>