Циклы в PHP. Краткое руководство
Цикл — это конструкция языка, которая выполняет блок кода больше одного раза.
Мы привыкли, что сценарии выполняются линейно: сверху вниз, строчка за строчкой. Но что делать, если надо повторить какую-нибудь инструкцию несколько раз? Например, как вывести на экран натуральные числа от 1 до 9?
Есть очевидный способ:
Но он заставляет писать много кода. И что если требуется вывести последовательность из миллиона чисел? Ещё бывают ситуации, когда заранее неизвестно сколько раз нужно выполнить определённую инструкцию.
Использование циклов значительно упрощает и укорачивает код. Циклы незаменимы в ситуациях, когда заранее неизвестно сколько раз должен выполниться блок кода. Такое число зависит от множества условий и вычисляется в момент выполнения сценария.
Так выглядит цикл в PHP:
Использование выражений в циклах
В прошлой главе вы познакомились с понятием выражения и его истинностью.
Выражение часто используется в циклах, оно помещается на место и определяет, будет ли исполнен блок кода — .
Если выражение из условия цикла возвращает истину, то выполнение сразу перейдёт к блоку «тело цикла». Если же оно вернёт ложь, то тело цикла не будет исполнено. Сценарий продолжит выполняться, как обычно, со следующей строки после цикла.
Название «циклы» отражает суть их действия — они «зацикливают» линейное исполнение на своём блоке кода и не дают сценарию выполняться дальше, пока условие цикла будет истинным.
Последовательность исполнения кода при использовании циклов:
- Обычное исполнение кода, строчка за строчкой, пока не встретился цикл.
- Встретился цикл: выполняем условие цикла.
- Если условие вернуло ложь: выходим из цикла, выполняем строчку после цикла и продолжаем линейное исполнение.
- Если условие вернуло истину: выполняем всё тело цикла.
- Повторяем пункт 2.
Каждая последовательность из шагов 2 — 4, то есть очередное выполнение кода в теле цикла — называется итерацией.
Количество итераций должно быть конечным, бесконечное выполнение одного блока кода не входит в наши планы.
А значит, необходимо заранее предусмотреть ситуацию, когда истинное условие станет ложным.
Теперь вернёмся к задаче по выводу на экран всех натуральных чисел:
Этот цикл в своём теле содержит две инструкции. Первая выводит на экран цифру из переменной. Вторая инструкция увеличивает значение переменной на единицу. Сколько раз будет исполнен такой цикл?
Циклы выполняются, пока их условие остаётся истинным, а в нашем условии значение переменной должно быть меньше десяти. Так как начальное значение переменной — единица, то несложно посчитать, что цикл выполнится ровно девять раз. На десятый раз значение переменной $last_num станет равно десяти и условие $last_num < 10 перестанет быть истинным.
Циклы и массивы
Чаще всего циклы используются для работы с массивами — для перечисления всех элементов массива и выполнения какого-нибудь действия с каждым из этих элементов. Умение использовать циклы и массивы совместно позволяет выполнять множество интересных и разнообразных задач!
Мы уже научились работать с массивами. Например, мы можем показать все значения массива, обратившись к каждому из элементов по его индексу. Но это утомительно: обращаться к каждому из элементов массива по очереди, когда мы хотим показать все его значения.
С помощью циклов показывают содержимое любого массива, и это требует всего несколько строк кода!
Перепишем пример с выводом списка любимых сериалов, задействовав цикл:
В этом примере цикл выводит элемент по индексу. Индекс теперь находится в переменной $cur_index и начальное значение у него ноль. Значение переменной увеличивается на единицу с каждой итерацией цикла, пока не достигнет трёх. В этот момент условие $cur_index < 3 перестанет быть истинным и цикл остановится, перебрав весь массив.
Потренируйтесь использовать циклы с массивами, пройдя этот тренажёр.
foreach — специальный цикл для массивов
Циклы в PHP могут быть разных типов. Выше мы познакомились с циклом типа while . Его главная особенность — необходимо указывать выражение в его условии. Но while не единственный вид циклов в PHP. Есть ещё как минимум два других.
Массивы и циклы так часто используются вместе, что разработчики языка даже добавили вид цикла специально для перебора массивов. Цикл называется foreach . Зачем понадобилось придумывать этот цикл?
Дело в том, что while слишком универсален. А платой за эту универсальность всегда будет более сложный и объёмный код. Приходится придумывать условие, следить, чтобы оно не было бесконечным. А в теле цикла обязательно надо не забыть увеличивать переменную-счётчик. И всё это нужно для простого перебора элементов массива. Неужели нельзя сделать проще?
foreach решает все эти проблемы. Его возможности:
- не требуется писать условие;
- позволяет получать ключи массива;
- сам присваивает очередной элемент массива переменной.
Цикл foreach незаменим, когда дело доходит до итерации по ассоциативным массивам. Например: у нас есть данные пользователя, которые хранятся в ассоциативном массиве. На сайте понадобилось сделать страницу с информацией об этом юзере. Задача в том, чтобы показать на странице все данные, которые известны об этом человеке. Выглядеть это должно так:
Имя: Евгений Возраст: 27 Род занятий: Программист
Оригинальный массив, который надо показать в таком виде:
$user = [ 'Имя' => 'Евгений', 'Возраст' => '27', 'Род занятий' => 'Программист' ];
Код сценария, который обойдёт массив и покажет всё его содержимое, займёт всего четыре строчки:
foreach ($user as $key => $value) < print($key . ': '); print($value . '
'); >
На каждой итерации цикла внутри его тела будут определяться переменные $key и $value . В первую будет попадать очередной ключ массива, а во вторую — очередное значение по этому ключу.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Зачем нужен цикл в массиве?
Цикл по всему массиву используют, чтобы произвести какие-то действия со всеми элементами массива, получить результат на основе обработки всех элементов массива.. Вроде бы это логично, не так ли?
26 авг 2020 в 15:22
Проще говоря цикл нужен, чтобы одновременно изменить все элементы в массиве? Я все правильно понял?
26 авг 2020 в 15:24
Ну, например, для вывода элементов массива по очереди, как в вашем коде.
26 авг 2020 в 15:28
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Чтобы проходиться по массиву. Можно его изменять, например
const arr = ["Яблоко", "Апельсин", "Груша"]; for (let i = 0; i < arr.length; i++) < arr[i] = arr[i] + ' Привет'; >console.log(arr);
Пример, как посчитать сумму элементов в массиве, для этого подойдёт цикл:
const arr = [1, 2, 3, 4, 5, 6, 7]; // Массив с числами let sum = 0; // Переменная, в которой будет высчитываться сумма for (let i = 0; i < arr.length; i++) < sum = sum + arr[i]; // переменная sum = sum + текущий элемент массива >// таким образом можно посчитать сумму всех элементов в массиве console.log(sum);
Пример, надо создать функцию, которая возвращает true, если в массиве есть число 5, иначе функция возвращает false:
function thereIsANumberFiveInTheArray(arr) < for (let i = 0; i < arr.length; i++) < if (arr[i] === 5) < return true; >> return false; > const arrNum5 = [1, 'Привет', 5]; const arrNotNum5 = [1, 'Привет']; console.log('arrNum5', thereIsANumberFiveInTheArray(arrNum5)); console.log('arrNotNum5', thereIsANumberFiveInTheArray(arrNotNum5));
Пример, вывести в консоль только нечетные элементы массива:
const arr = [1, 2, 3, 4, 5, 6]; for (let i = 0; i < arr.length; i++) < if (arr[i] % 2 === 1) < console.log(arr[i]); >>
Цикл
Цикл в программировании — это управляющая конструкция, которая заставляет какой-то блок кода выполняться несколько раз. Циклы есть в большинстве языков программирования. Чаще всего их объявляют командами for, while или repeat.

«IT-специалист с нуля» — наш лучший курс для старта в IT
Блок кода, который нужно повторять, называется телом цикла. Там может быть практически любой код, необходимый разработчику. Сама управляющая конструкция описывает, как долго повторять действия: можно задать четкое количество повторений или заставить цикл выполняться до достижения какого-то условия.
Сколько раз пройдет цикл, зависит от его условий и задачи. Бывают циклы, которые не могут выполниться ни разу, а бывают те, что проходят сотни итераций, вплоть до бесконечности. Иногда это ошибка, иногда — ожидаемое поведение.

Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

Кто и зачем пользуется циклами
Циклы встречаются в работе большинства программистов практически на всех языках программирования. Они есть в Java, JavaScript, PHP, Python, C++ — везде. Циклов в привычном виде нет разве что в очень низкоуровневых языках, близких к «железу», таких как ассемблер.
Циклами пользуются для задач, в рамках которых нужно повторить одно и то же действие несколько раз. Таких задач в разработке много. Например:
- построчно посчитать данные из файла;
- обработать каждый элемент структуры данных по очереди;
- видоизменить целый ряд данных;
- решить математическую задачу;
- обновить экран.
- решить математическую задачу;
- обновить экран.
Некоторые алгоритмы итеративные, то есть работают с несколькими итерациями — повторениями. Чтобы их реализовать, обычно нужны циклы.
Частичной альтернативой циклам в программировании можно назвать некоторые встроенные функции высшего порядка. Они могут выполнять несколько действий, например с массивом. Но такие функции есть не во всех языках и подходят не для всего. Циклы универсальнее.
Какими бывают циклы
Обычно в языках программирования несколько видов циклов. У каждого из них свое назначение. Разберемся с основными.
For. Это цикл, который выполняется заданное количество раз. В большинстве C-подобных языков (то есть таких, которые внешне похожи на C и C++) он имеет похожую структуру:
Объявление переменной — это создание итератора, переменной, которая будет изменяться на каждом шаге цикла. Когда итератор достигнет какого-то значения, цикл закончится.
Условие описывает, должен ли цикл продолжаться. Пока оно выполняется, цикл работает. Чаще всего условие — итератор меньше или больше определенного числа. Соответственно, когда итератор достигает указанного значения, цикл останавливается.
Действие — то, что нужно выполнить в конце каждой итерации. Сюда записывают изменения итератора: например, добавить к нему единицу или отнять какое-то число.
Стандартный случай — задается итератор, равный 0. Условие — итератор меньше какого-нибудь N. Действие — прибавить к итератору единицу. Цикл будет выполняться N+1 раз, потому что отсчет идет с нуля. Есть и вариации, их рассмотрим ниже.
В некоторых языках, таких как Python или Pascal, синтаксис цикла For другой. Но суть та же: им пользуются, когда нужное количество действий известно заранее.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
For in / for of / for-each. Частный случай цикла for — когда нужно пройти по структуре данных. Для этого в некоторых языках существует особая конструкция. Это цикл for, который вместо итератора работает с самой структурой данных, например массивом или объектом.
В JavaScript такой цикл называется for of (есть еще for in, но он работает немного иначе), в Java — for-each, в Python — for in. Синтаксис примерно такой:
for in* < > * in приведено для примера. В JS там не in, а of, а в Java и C++ — вообще двоеточие.
Такой цикл будет отрабатывать определенное количество раз, ровно столько, сколько элементов в структуре данных. А итератор на каждом шаге будет равняться или текущему элементу в структуре, или его номеру. Это зависит от языка и выбранной конструкции.
Этот подход удобен, ведь он позволяет более лаконично и понятно описывать работу с массивами и другими структурами данных.
Не стоит путать этот цикл с функцией forEach(). Она проходит по массиву и что-то делает с каждым его элементом. Но это не цикл, а одна из функций высшего порядка, о которых мы говорили ранее.
While с предусловием. While — совсем другой случай. Это цикл, который используют, если нужное количество действий заранее неизвестно. Он может выполниться несколько раз, один раз, бесконечное количество раз — или вообще не выполниться ни разу. Слово while переводится как «пока» и отражает суть: пока верно какое-то условие, цикл выполняется.
Синтаксис у него примерно такой, хотя в зависимости от языка детали могут различаться:
while () < >
Он выглядит проще, чем for, и иногда используется как его альтернатива. Но суть у этого цикла другая. Например, мы заранее не знаем, сколько шагов придется сделать, чтобы реализовать итерационный алгоритм. В таких случаях и нужен while.
While с постусловием. Это вариация цикла while. Ее единственное отличие — условие пишется не до, а после тела цикла:
do < > while ();
Условие будет проверяться, когда подпрограмма уже выполнится. А еще такой цикл всегда исполнится как минимум один раз, до проверки условия. Его используют реже, чем while с предусловием, но иногда такая конструкция выручает.
Repeat / until. В некоторых языках есть еще один вид цикла — repeat или until. Он похож на while, но, в отличие от него, описывает не условие для продолжения, а условие для выхода из цикла. Цикл закончится, когда условие окажется верным.
В Pascal это цикл с постусловием, который описывается так:
repeat < > until (); А, например, в Perl это цикл с предусловием: until () < >
Этот вид цикла не прижился в разработке и встречается довольно редко. В большинстве языков его нет. Но о нем стоит помнить, если вы хотите писать на языках, где существует такая конструкция.
Как можно модифицировать циклы
Стандартный цикл по счетчику или условию можно изменить. Это редко нужно в коммерческой разработке, но может пригодиться при реализации алгоритмов.
Цикл по структуре данных. Это цикл for in / for of, о котором мы уже говорили. Обычным циклом тоже можно пройти по массиву: запустить счетчик от 0 до длины структуры данных. Но тут есть детали, которые стоит прояснить подробнее.
Структура данных должна быть итерируемой. Это свойство некоторых сущностей в программировании — оно говорит, что содержимое сущности можно перечислить. У итерируемых объектов есть внутренний итератор — указатель, который служит для перечисления.
Если структура не итерируемая, то пройти по ней циклом for in / for of обычно нельзя. В большинстве языков программирования это работает именно так.
Структуру можно сделать итерируемой: написать свой итератор или присоединить стандартный. Такая возможность есть в большинстве языков программирования и помогает тонко управлять перебором структур данных.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Цикл в обратную сторону. Тут все проще: цикл for можно запустить не только от 0 до какого-то числа, но и наоборот. Тогда итератор на каждом шаге будет не увеличиваться, а уменьшаться на единицу. Соответственно, цикл пройдет столько же раз, но в обратном направлении. Иногда эта возможность бывает полезной.
Кстати, повернуть цикл for в другую сторону — не единственная его модификация. Можно, например, сделать цикл с шагом 2 и больше, чтобы итератор изменялся не на 1, а на 2 или другое число. Можно вообще не складывать с ним или вычитать из него числа, а умножать или делить. Вариаций много. Но используют их не так часто, чтобы не усложнять код: хорошая практика — делать программу понятной и легко читаемой.
Вложенный цикл. Его иногда называют двойным циклом. Это цикл, в который вложен другой цикл. Чаще всего это цикл for.
Тело внешнего цикла — внутренний цикл. А уже внутри могут быть разные подпрограммы.
Вложенными циклами могут пользоваться, например, для вычислений в двумерных структурах данных: матрицах, тензорах. Но в целом считается, что если использования вложенных циклов можно избежать, лучше так и сделать.
На каждом шаге внешнего цикла выполняется весь внутренний, целиком. Если внешний цикл происходит N раз, а внутренний — M раз, то общее количество итераций во вложенном цикле — N * M. Это много. Поэтому вложенные циклы ресурсоемкие, и ими пользуются, только если без них не обойтись. К тому же конструкция из двух циклов друг в друге серьезно усложняет читаемость кода.
Бесконечный цикл. Если в цикле нет условия для выхода, подпрограмма внутри него будет повторяться бесконечно. Она завершится, только если прервать исполнение всего кода.
Бесконечным чаще всего становится цикл while, но в теории таким можно сделать и цикл for — например, если не менять итератор или установить невозможное условие для выхода.
Зачастую бесконечный цикл — ошибка начинающих программистов, которые неверно описали условие. Но есть ситуации, когда бесконечное повторение — штатный режим работы. Например, программа в бесконечном цикле раз в несколько миллисекунд обновляет изображение на экране — это закончится, только если выйти из нее.
Как прервать цикл
Существует несколько способов остановить выполнение цикла. Чаще всего используют тот, который предусмотрен самой конструкцией, — невыполнение условия. Но есть и другие возможности. Пользоваться ими не всегда корректно.
Невыполнение условия. Наиболее частый вариант: условие для продолжения цикла больше не выполняется. Итератор достиг нужного значения, или переменная, которую нужно было отыскать, найдена. Тогда цикл прекращается, программа начинает выполнять код, который был написан после него.
Условия могут быть разными, в том числе сложными, состоящими из нескольких частей. Ниже мы расскажем про break и continue — в большинстве случаев грамотно составленные условия помогают обойтись без использования этих операторов.
Пропуск итерации. Если по какой-то причине в цикле нужно закончить итерацию раньше времени и перейти на следующую, для этого есть специальная команда. Обычно она называется continue. По сути, это оператор, который говорит программе: «Закончи это повторение, продолжи со следующего шага».
Continue нужно просто написать в том месте, где вы хотите выйти из текущей итерации, — например, если в программе выполнилось какое-то условие.
На практике continue используется не слишком часто, во многих языках его считают плохой практикой. Его можно заменить условным оператором.
Выход из цикла. Можно экстренно выйти из цикла в любой момент. Для этого во многих языках программирования существует команда break. Она означает «Прерви выполнение подпрограммы и выйди из нее».
Когда программа доходит до этой команды, она выходит из цикла или условия и начинает выполнять код, который идет дальше. Никаких итераций больше не происходит. Например, мы искали в цикле какое-то число, нашли его — дальше проходить по циклу не нужно. Можно из него выйти.
Использование break для выхода из циклов тоже считают плохой практикой в большинстве языков программирования. Считается, что этот оператор нарушает стройность и логику работы программы, делает код сложнее в отладке. Поэтому пользоваться им без крайней нужды не рекомендуется.
Команду можно использовать не только в циклах, но и, например, в условных структурах if/else.
Пауза. Некоторые языки дают возможность временно приостановить цикл, как бы установить задержку для его выполнения. Например, подождать несколько секунд — для этого есть специальные функции. Как реализовать такую возможность, зависит от языка и ситуации.
Что нужно знать при использовании циклов
В некоторых языках циклы использовать принято, только если нет альтернативы. Это связано с особенностями подхода к программированию. Например, в JavaScript считается хорошей практикой по возможности пользоваться для обработки массивов функциями высшего порядка, а к циклам прибегать, только если иначе никак.
Циклы, особенно вложенные, отнимают довольно много ресурсов. Они менее ресурсоемкие, чем рекурсия, но, если неоптимально решить какую-то задачу, можно потерять много памяти. Это стоит учитывать при реализации алгоритмов.
Пользоваться операторами break и continue без нужды — плохая практика в большинстве языков программирования. Они нарушают структуру программы, делают код менее логичным и предсказуемым.
При использовании циклов нужно следить, насколько правильно описан и подсчитывается итератор. Иначе есть риск получить бесконечный или неверно работающий цикл.
Хотите узнать больше про языки программирования? Запишитесь на курсы и станьте разработчиком на одном из востребованных современных языков.
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Цикл For — Java: Массивы
Работа с массивами почти всегда завязана на одновременную обработку всех его элементов. Это нужно при выводе списков на экран, при выполнении различных расчетов или проверке данных. Во всех этих случаях нужен механизм для перебора элементов массива. Самый простой способ сделать это – использовать цикл.
Обход
Циклы напрямую с массивами не связаны, но у циклов есть счетчик, который может выступать в качестве индекса массива. Поэтому соединить их не составляет никакого труда:
// Создаем массив String[] userNames = "petya", "vasya", "evgeny">; // Определяем цикл // Начальное значение счетчика var i = 0 – вычисляется один раз перед началом выполнения // Условие остановки i < userNames.length – выполняется перед каждой итерацией// Изменение счетчика i += 1 – выполняется после каждой итерации for (var i = 0; i userNames.length; i++) // Этот код выполняется для каждого элемента System.out.println(userNames[i]); > // => "petya" // => "vasya" // => "evgeny"
В данном коде создаем массив из трех элементов — имен. Далее в цикле обходим массив и выводим на экран все имена так, что каждое имя оказывается на новой строке ( System.out.println() автоматически делает перевод строки).
Рассмотрим этот этап подробнее. При обходе массива циклом for счетчик, как правило, играет роль индекса в массиве. Он инициализируется нулем и увеличивается до userNames.length — 1 , что соответствует индексу последнего элемента. Именно поэтому мы используем строгое сравнение < (меньше) в условном выражении i < userNames.length , а не меньше либо равно).
А что, если нам нужно вывести значения в обратном порядке? Для этого есть два способа. Один — идти в прямом порядке, то есть от нулевого индекса до последнего, и каждый раз вычислять нужный индекс по такой формуле размер массива — 1 — текущее значение счетчика .
String[] userNames = "petya", "vasya", "evgeny">; for (var i = 0; i userNames.length; i++) var index = userNames.length - 1 - i; System.out.println(userNames[index]); // Можно даже так // var userName = userNames[userNames.length - 1 - i]; // System.out.println(userName); > // => "evgeny" // => "vasya" // => "petya"
Другой способ подразумевает обход в обратном порядке, от верхней границы до нижней, то есть от последнего индекса массива к первому (нулю, так как индексирование начинается с нуля). В такой ситуации код меняется на следующий:
String[] userNames = "petya", "vasya", "evgeny">; // Начальное значение i соответствует последнему индексу в массиве for (var i = userNames.length - 1; i >= 0; i--) System.out.println(userNames[i]); > // => "evgeny" // => "vasya" // => "petya"
При таком обходе проверка остановки должна быть именно на >= , иначе элемент с индексом 0 не попадет в цикл.
Изменение
Во время обхода массива его можно не только читать, но и модифицировать. Предположим, что перед нами стоит задача нормализации списка электронных адресов — например, приведение их к нижнему регистру. Тогда код будет выглядеть так:
import java.util.Arrays; String[] emails = "VASYA@gmAil.com", "iGoR@yandex.RU", "netiD@hot.CoM">; System.out.println(Arrays.toString(emails)); // => [VASYA@gmAil.com, iGoR@yandex.RU, netiD@hot.CoM] for (var i = 0; i emails.length; i++) var email = emails[i]; var normalizedEmail = email.toLowerCase(); // Заменяем значение emails[i] = normalizedEmail; > System.out.println(Arrays.toString(emails)); // => [vasya@gmail.com, igor@yandex.ru, netid@hot.com]
Ключевая строчка: emails[i] = normalizedEmail; . В ней происходит перезапись элемента под индексом i .
Итого
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: