Циклы в PHP
Цикл — это конструкция языка, которая позволяет выполнить блок кода больше одного раза.
Мы привыкли, что наши сценарии выполняются линейно: сверху вниз, строчка за строчкой, инструкция за инструкцией. Но что делать, если надо повторить какую-нибудь инструкцию несколько раз?
Например, как вывести на экран натуральные числа от 1 до 9? Есть очевидный способ:
<?php
print(1);
print(2);
print(3);
// и так далее...
Но, во первых, такой способ заставляет писать много кода. Во-вторых, что если требуется вывести последовательность из миллиона чисел? И, наконец, бывают ситуации, когда заранее неизвестно сколько раз нужно выполнить определённую инструкцию.
Использование циклов значительно упрощает и укорачивает код. Также циклы незаменимы в ситуациях, когда заранее неизвестно сколько раз должен выполниться блок кода. Такое число может зависеть от множества условий и вычисляться в момент выполнения сценария.
Так выглядит цикл в PHP:
<?php
while (<условие цикла>) {
<тело цикла>
}
В прошлой главе учебника вы познакомились с понятием выражения и его истинностью. Выражения часто используются в циклах следующим образом: выражение помещается на место <условие цикла=""> и определяет, будет ли исполнен блок кода — <тело цикла="">. тело>условие>
Если выражение из условия цикла возвращает истину, то выполнение сразу перейдёт к блоку «тело цикла», если же оно вернёт ложь — то тело цикла исполнено не будет и сценарий продолжит выполняться как обычно, со следующей строки после цикла.
Выходит, что циклы имеют такое название, потому что как бы «зацикливают» обычное, линейное исполнение на своем блоке кода и не дают сценарию выполняться дальше, пока условие цикла будет истинным.
Важно понимать последовательность, в которой исполняется код при использовании циклов.
- Обычное исполнение кода, строчка за строчкой, пока не встретился цикл.
- Встретился цикл: выполняем условие цикла.
- Если условие вернуло ложь: выходим из цикла, выполняем строчку после него и продолжаем линейное исполнение.
- Если условие вернуло истину: выполняем всё тело цикла.
- Повторяем пункт 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
. В первую будет попадать очередной ключ массива, а во вторую — очередное значение по этому ключу.