(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);
}
?>