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