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

    ?>

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open