PHP 8.4.2 Released!

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

?>

Добавить

Примечания пользователей 2 notes

up
315
matthiaz
12 years ago
Looping through letters is possible. I'm amazed at how few people know that.

for($col = 'R'; $col != 'AD'; $col++) {
echo $col.' ';
}

returns: R S T U V W X Y Z AA AB AC

Take note that you can't use $col < 'AD'. It only works with !=
Very convenient when working with excel columns.
up
70
nzamani at cyberworldz dot de
23 years ago
The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn't change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
somewhat_doSomethingWith($i);
}
?>

Faster would be:

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; $i++) {
somewhat_doSomethingWith($i);
}
?>

And here a little trick:

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

The $i gets changed after the copy for the function (post-increment).
To Top