PHP – циклы (foreach, while, for, do-while)

Циклы – что это такое и зачем они нужны?

Конечно же, когда новичок слышит о циклах, он немного может быть напуган, возможно ему не объяснили на уроке информатики, что это такое, а возможно просто страшен их синтаксис, но я скажу вам одно, не стоит бояться циклов, конечно кроме вечных. Что такое вечные циклы и их опасность я тоже сегодня расскажу.

Цикличность нам знакома с детства, катались на велосипеде? Да, это цикл, мы крутим педали пока не устанем или пока не приедем на место, это обычный while, при этом как с  предусловием, так и может быть с постусловием. Что такое циклы с предусловием и постусловием? Что такое итератор и итерация? Читайте сегодня в этой статье!

Циклы для перебора массива (коллекции элементов)

Вспомним корзинку, которую я приводил в пример в статье про массивы. Та самая корзинка с товарами из супермаркета, как вы будете из нее выкладывать продукты, да, возьмете каждый и положите его на ленту кассиру. Как в переводе с русского на английский будет: “для каждого”? For each! Тот самый цикл foreach, берем наш массив, суем его в foreach и наш цикл “зафурычил”! Я вот всегда думаю, наверное русское выражение “фурычить” или “зафурычил” пошло именно отсюда, его наверное придумал айтишник. Ладно, не будем отвлекаться.

Foreach – по мне самый простой и самый удобный цикл для работы с массивами. Не будем ходить вокруг да около, давайте рассмотрим пример:

<?php
$fruits = ["orange", "mango", "banana", "grape", "peach"];

foreach ($fruits as $fruit)
    {
        echo $fruit . "\n";
    }
?>

У нас есть “корзинка с фруктами” и мы перебираем каждый фрукт и выводим его название на экран. Для того, чтобы лучше запомнить цикл foreach я советую вам проговаривать то, что вы пишите например этот пример будет звучать так: “для каждого фрукты, как фрукт…”, так ведь действительно проще запомнить?

Циклы с заранее известным количеством итераций

У цикла есть такое понятие как итерация. Что такое итерация цикла? Итерация цикла – это один проход цикла, количество итераций – это количество проходов цикла, выполнений цикла. Например вам нужно сделать 10 шагов, вы заранее знаете сколько шагов нужно сделать и будете шагать, пока количество сделанных шагов не будет равно 10. Ключевое слово “пока”, по английски это “while”, цикл так и называется.

Синтаксис цикла while достаточно прост. Давайте напишем код примера с шагами:

<?php
echo "мне нужно сделать 10 шагов\n";
$i = 0;
while ($i < 10)
    {
        echo "шаг\n";
        $i++;
    }
echo "стоп\n";
?>

Запись “$i++” означает увеличение итератора на единицу, то есть изначально наше количество шагов равно нулю, мы начинаем шагать и постепенно считаем шаги, как только мы сделали 10 шагов мы останавливаемся, как и наш цикл, условие не включает “10” так как нумерация шагов идет от “0”, то есть нулевой шаг – это первый шаг. Если проговорить этот цикл, то звучать он будет так: “пока количество шагов меньше 10 мы шагаем…”.

Есть еще один вариант цикла с предусловием, цикл с предусловием – это цикл в котором условие стоит на входе в него, то есть если условие не выполнится (не истинное), тогда и цикл не разу не запуститься. Давайте рассмотрим цикл for – “для”.

Тот же пример с шагами с циклом “for”:

<?php
echo "я начинаю шагать\n";
for ($i = 0; $i < 10; $i++)
    {
        echo "шаг\n";
    }
echo "стоп\n";
?>

Итак, с первого взгляда это страшный цикл, столько параметров… но это лишь на первый взгляд, давайте разберем его. Первый параметр цикла – это итератор, здесь мы задаем его начальное значение, вторым идет логическое выражение (условие выполнения цикла), пока оно истинно, цикл будет выполняться, третье – это то, что будет выполнено после каждой итерации, в нашем случае это прибавление единицы к итератору (считаем сделанные шаги). Проговорим? “для изначально шагов равных 0, пока шаги не равны 10, шагаем…”, примерно так будет звучать.

С циклами для перебора коллекции и с предусловием мы разобрались. Пора приступить к десерту – циклы с постусловием.

Цикл do-while (цикл с постусловием)

Я специально оставил этот цикл на десерт, он используется не так часто, как циклы описанные мною выше. Цикл с постусловием нужен тогда, когда мы не знаем заранее количество необходимых итераций и нам надо его получить либо на входе в цикл, либо после какого-либо действия внутри цикла. Циклы с постусловием часто могут стать вечными, при допущении внутри его ошибки, бага, как тестировать код мы поговорим позже. А сейчас давайте я приведу вам пример использования цикла do-while в жизни:

<?php
echo "я начинаю идти\n";
do
    {
        if (isset($i) === false)
            {
                $i = 0;
                $a = 10;
            }
        echo "шаг\n";
        $i++;
    } while ($i < $a);
echo "стоп\n";
?>

Мы определили количество шагов после того, как начали движение, начали считать с нуля, когда проверили, что итератор не существует, после стали прибавлять по одному шагу и в итоге когда мы дошли до 10 шагов покинули цикл. Если проговорить цикл, то будет звучать так: “делаем… шагаем… пока мы не сделали 10 шагов”.

Например использование циклов с постусловием имеет место когда вы делаете HTTP запрос на сервер, например чтобы получить страницу, вам не приходит ответ 200, и вы будете пытаться получить страницу пока не получите ответ 200, например будете подбирать PROXY. Суть в том, что цикл с постусловием дает нам возможность выполнить хотя бы одну операцию, пока мы не добрались до условия его выполнения. Я потом расскажу вам как я собирал объявления по недвижимости используя цикл с постусловием, а сейчас расскажу чем опасны циклы с постусловием и почему стоит избегать вечные циклы.

Чем опасны вечные циклы

Вечный цикл! Даже звучит страшно. Этот цикл может “повесить” не только скрипт, но и вашу машину (компьютер). Проблема в том, что разработчик может налететь на случай, когда условие в конце не выполнится или же когда он сделал цикл с предусловием, засунул в условие “true” и внутри цикла пытается сделать “break” (остановить цикл), но допустив ошибку никогда не попадет в ветку с остановкой цикла – в итоге цикл зависнет!

Пример простого вечного цикла:

<?php
while (true)
    {
        echo "этот цикл никогда не остановится\n";
    }
// второй вариант
do
    {
        echo "этот цикл никогда не остановится\n";
    } while (true);
?>

Я вам даже не советую это запускать 😀

Подведем итоги

Я на простых примерах объяснил вам, что такое циклы и с чем их едят, есть мы их будем в следующей статье, которая по традиции моего блога будет практической, а это значит что мы каждый цикл потрогаем руками и запустим в PHP-скриптах. Ну а сейчас еще несколько раз почитайте теорию, чтобы она лучше усвоилась. После этого я жду вас в следующей статье.

Подпишитесь на рассылку новых статей

Подпишитесь на рассылку свежих статей и присоединяйтесь к 7 остальным подписчикам.