(PHP 4, PHP 5, PHP 7)
Цикл for самый сложный цикл в PHP. Он ведет себя так же как его аналог в языке C. Синтаксис цикла for следующий:
for (expr1; expr2; expr3) statement
Первое выражение (expr1) всегда вычисляется (выполняется) только один раз в начале цикла.
В начале каждой итерации оценивается выражение expr2. Если оно принимает значение TRUE
, то цикл продолжается, и вложенные операторы будут выполнены. Если оно принимает значение FALSE
, выполнение цикла заканчивается.
В конце каждой итерации выражение expr3 вычисляется (выполняется ).
Каждое из выражений может быть пустым или содержать несколько выражений, разделенных запятыми. В expr2 все выражения, разделенные запятыми, вычисляются, но результат берется из последнего. Если выражение expr2 отсутствует, это означает, что цикл будет выполняться бесконечно. (PHP неявно воспринимает это значение как TRUE
, так же, как в языке C). Это может быть не столь бесполезно, сколь вы могли подумать, так как часто необходимо прервать цикл, используя условный оператор break вместо использования выражения в цикле for, которое принимает истинное значение.
Рассмотрим следующие примеры. Все из них отображают числа от 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); } ?>