Цикл — это конструкция языка, которая позволяет выполнить блок кода больше одного раза.

Мы привыкли, что наши сценарии выполняются линейно: сверху вниз, строчка за строчкой, инструкция за интструкцией. Но что делать, если надо повторить какую-нибудь инструкцию несколько раз?
Например, как вывести на экран все натуральные числа (1...9)? Никто не мешает сделать это очевидным способом:

<?php
print(1);
print(2);
print(3);
// и так далее...

Но, во первых, такой способ заставляет писать много кода. Во-вторых, что если требуется вывести последовательность из миллиона чисел? И, наконец, бывают ситуации, когда заранее неизвестно сколько раз нужно выполнить определённую инструкцию...

Использование циклов значительно упрощает и укорачивает код. Также циклы незаменимы в ситуациях, когда заранее неизвестно сколько раз должен выполниться блок кода. Такое число может зависеть от множества условий и вычисляется в момент выполнения сценария.

Так в PHP выглядит цикл:

<?php
while (<условие цикла>) {
<тело цикла>
}

В прошлой главе учебника вы познакомились с понятием выражения и его истинностью. Выражения часто используются в циклах следующим образом: выражение помещается на место <условие цикла=""> и определяет, будет ли исполнен блок кода - <тело цикла="">.

Если выражение из условия цикла возвращает истину, то выполнение сразу перейдёт к блоку «тело цикла», если же оно вернёт ложь — то тело цикла исполнено не будет и сценарий продолжит выполняться как обычно, со следующей строки после цикла.

Выходит, что циклы имеют такое название, потому что как бы «зацикливают» обычное, линейное исполнение на своем блоке кода и не дают сценарию выполняться дальше, пока условие цикла будет истинным.

Важно понимать последовательность, в которой исполняется код при использовании циклов.

  1. Обычное исполнение кода, строчка за строчкой, пока не встретился цикл.
  2. Встретился цикл: выполняем условие цикла.
  3. Если условие вернуло ложь: выходим из цикла, выполняем строчку после него и продолжаем линейное исполнение.
  4. Если условие вернуло истину: выполняем всё тело цикла.
  5. Повторяем пункт 2.

Каждая последовательность из шагов 2-4, то есть очередное выполнение блока кода в теле цикла — называется итерацией.

Количество итераций должно быть конечным, то есть, как правило, бесконечное выполнение одного блока кода не входит в наши планы.
А значит необходимо заранее предусмотреть ситуацию, когда истинное условие станет ложным.

Теперь вернёмся к задаче по выводу на экран всех натуральных чисел:

<?php
$last_num = 1;

while ($last_num < 10) {
    print($last_num);
    $last_num = $last_num + 1;
}

Данный цикл в своём теле содержит две инструкции. Первая выводит на экран цифру из переменной. Вторая инструкция увеличивает значение переменной на единицу. Теперь вопрос: сколько раз будет исполнен такой цикл?

Циклы выполняются, пока их условие остаётся истинным, а в нашем условии значение переменной должно быть меньше десяти. Так как начальное значение переменной — единица, то не сложно посчитать, что цикл выполнится ровно девять раз. На десятый раз значение переменной $last_num станет равно десяти и условие $last_num < 10 перестанет быть истинным.

Циклы и массивы

Чаще всего циклы используются для работы с массивами. А конкретнее — для перечисления всех элементов массива и выполнения какого-нибудь действия с каждым из этих элементов.
Умение использовать циклы и массивы совместно, сразу позволит тебе выполнять множество интересных и разнообразных задач!

Чуть раньше мы уже научились работать с массивами. Например, мы можем показать все значения массива, обратившись к каждому из элементов по его индексу. Но это чрезвычайно утомительно: обращаться к каждому из элементов массива по очереди, когда мы просто хотим показать всего его значения. Циклы избавят от этой рутины!

С помощью циклов можно показать содержимое любого массива и это потребует всего несколько строк кода!

Перепишем пример с выводом списка любимых сериалов, но теперь задействовав цикл:

<?php
$fav_shows = ["game of thrones", "american horror storry", "walking dead"];
$cur_index = 0;

while ($cur_index < 3) {
    print($fav_shows[$cur_index] . ", ");
    $cur_index = $cur_index + 1;
}

В этом примере цикл выводит элемент по индексу. Индекс теперь находится в переменной $cur_index и начальное значение у него ноль. Значение переменной увеличивается на единицу с каждой итерацией цикла, пока не достигнет трёх. В этот момент условие $cur_index < 3 перестанет быть истинным и цикл остановится, перебрав весь массив.

foreach — специальный цикл для массивов

Настало время узнать, что циклы в PHP могут быть разных типов. Выше мы познакомились с циклом типа while. Главная особенность этого типа в том, что необходимо указывать выражение в его условии. Но while - это не единственный вид циклов в PHP. Есть ещё как минимум два других.

Массивы и циклы так часто используются вместе, что разработчики языка даже добавили вид цикла специально для перебора массивов. Он называется foreach. Но что не так с обычным while и зачем понадобилось придумывать этот foreach?

Дело в том, что цикл while слишком универсален. А платой за эту универсальность всегда будет более сложный и обьемный код. Приходится придумывать условие, следить, чтобы оно не было бесконечным. А в теле цикла обязательно надо не забыть увеличивать переменную-счётчик. И всё это нужно для простого перебора элементов массива. Неужели нельзя сделать проще?

К счастью, foreach решает все эти проблемы. Вот его возможности:

  • не требуется писать условие;
  • позволяет получать ключи массива;
  • сам присваивает очередной элемент массива переменной.

Цикл foreach становится совершенно незаменим, когда дело доходит до итерации по ассоциативным массивам. Возьмём такой пример: у нас есть данные пользователя, которые хранятся в ассоциативном массиве. На сайте понадобилось сделать страницу с информацией об этом юзере. Задача состоит в том, чтобы показать на странице все данные, которые известны об этом человеке. Выглядеть это должно так:

Имя: Евгений
Возраст: 27
Род занятий: Программист

Оригинальный массив, который надо показать в таком виде:

$user = [
    'Имя' => 'Евгений',
    'Возраст' => '27',
    'Род занятий' => 'Программист'
];

Код сценария, который обойдёт массив и покажет всё его содержимое займёт всего 4 строчки:

foreach ($user as $key => $value) {
    print($key . ': ');
    print($value . '<br>');
}

На каждой итерации цикла, внутри его тела будут определяться переменные $key и $value. В первую будет попадать очередной ключ массива, а во вторую — очередное значение по этому ключу.