PHP junior. Урок 6. Циклы в PHP

Tatsiana Kruzhaeva
5 min readJan 6, 2018

--

Циклы позволяют повторять определенное (и даже неопределенное — когда работа цикла зависит от условия) колличество раз различные операторы. Данные операторы называются телом цикла. Проход цикла называется итерацией.

PHP поддерживает три вида циклов:

  • Цикл с предусловием (while);
  • Цикл с постусловием (do-while);
  • Цикл со счетчиком (for);
  • Специальный цикл перебора массивов (foreach).

При использовании циклов есть возможность использования операторов break и continue. Первый из них прерывает работу всего цикла, а второй — только текущей итерации.

Рассмотрим циклы PHP:

Цикл с предусловием while

Цикл с предусловием while работает по следующим принципам:

  1. Вычисляется значение логического выражения.
  2. Если значение истинно, выполняется тело цикла, в противном случае — переходим на следующий за циклом оператор.

Синтаксис цикла с предусловием:

while (логическое_выражение)
инструкция;

В данном случае телом цикла является инструкция. Обычно тело цикла состоит из большого числа операторов. Приведем пример цикла с предусловием while:

<?php
$x=0;
while ($x++<10) echo $x;
// Выводит 12345678910
?>

Обратите внимание на последовательность выполнения операций условия $x++<10. Сначала проверяется условие, а только потом увеличивается значение переменной. Если мы поставим операцию инкремента перед переменной (++$x<10), то сначала будет выполнено увеличение переменной, а только затем — сравнение. В результате мы получим строку 123456789. Этот же цикл можно было бы записать по-другому:

<?php
$x=0;
while ($x<10)
{
$x++; // Увеличение счетчика
echo $x;
}
// Выводит 12345678910
?>

Если мы увеличим счетчик после выполнения оператора echo, мы получим строку 0123456789. В любом случае, мы имеем 10 итераций. Итерация — это выполение операторов внутри тела цикла.

Подобно конструкции условного оператора if, можно группировать операторы внутри тела цикла while, используя следующий альтернативный синтаксис:

while (логическое_выражение):
инструкция;
...
endwhile;

Пример использования альтернативного синтаксиса:

<?php
$x = 1;
while ($x <= 10):
echo $x;
$x++;
endwhile;
?>

Цикл с постусловием do while

В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода (итерации). Таким образом, тело цикла выполняется хотя бы один раз. Синтаксис цикла с постусловием такой:

do
{
тело_цикла;
}
while (логическое_выражение);

После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается.
Альтернативного синтаксиса для do-while разработчики PHP не предусмотрели (видимо, из-за того, что, в отличие от прикладного программирования, этот цикл довольно редко используется при программировании web-приложений).

Пример скрипта, показывающего работу цикла с постусловием do-while:

<?php
$x = 1;
do {
echo $x;
} while ($x++<10);
?>

Рассмотренный сценарий выводит: 12345678910

Цикл со счетчиком for

Цикл со счетчиком используется для выполнения тела цикла определенное число раз. С помощью цикла for можно (и нужно) создавать конструкции, которые будут выполнять действия совсем не такие тривиальные, как простая переборка значения счетчика.

Синтаксис цикла for такой:

for (инициализирующие_команды; условие_цикла; команды_после_итерации) { тело_цикла; }

Цикл for начинает свою работу с выполнения инициализирующих_команд. Данные команды выполняются только один раз. После этого проверяется условие_цикла, если оно истинно (true), то выполняется тело_цикла. После того, как будет выполнен последний оператор тела, выполняются команды_после_итерации. Затем снова проверяется условие_цикла. Если оно истинно (true), выполняется тело_цикла и команды_после_итерации, и.т.д.

<?php
for ($x=0; $x<10; $x++) echo $x;
?>

Данный сценарий выводит: 0123456789

Есть вариант вывода строки 12345678910:

<?php
for ($x=0; $x++<10;) echo $x;
// Выводит 12345678910
?>

В данном примере мы обеспечили увеличение счетчика при проверке логического выражения. В таком случае нам не нужны были команды, выполняющиеся после итерации.

Если необходимо указать несколько команд, их можно разделить запятыми, пример:

<?php
for ($x=0, $y=0; $x<10; $x++, $y++) echo $x;
// Выводит 0123456789
?>

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

<?php
for($i=0,$j=0,$k="Точки"; $i<10; $j++,$i+=$j) { $k=$k."."; echo $k; }
// Выводит Точки.Точки..Точки...Точки....
?>

Рассмотренный пример (да и вообще любой цикл for) можно реализовать и через while, только это будет выглядеть не так изящно и лаконично.

Для цикла for имеется и альтернативный синтаксис:

for(инициализирующие_команды; условие_цикла; команды_после_итерации):
операторы;
endfor;

Цикл перебора массивов foreach

В PHP4 появился еще один специальный тип цикла — foreach. Данный цикл предназначен специально для перебора массивов.

Синтаксис цикла foreach выглядит следующим образом:

foreach (массив as $ключ=>$значение)
команды;

Здесь команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=>значение оказывается в переменных $ключ и $значение. Приведем пример работы цикла foreach:

<?php
$names["Иванов"] = "Андрей";
$names["Петров"] = "Борис";
$names["Волков"] = "Сергей";
$names["Макаров"] = "Федор";
foreach ($names as $key => $value) {
echo "<b>$value $key</b><br>";
}
?>

Рассмотренный сценарий выводит:

Андрей Иванов
Борис Петров
Сергей Волков
Федор Макаров

У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента. Выглядит она так:

foreach (массив as $значение)
команды;

В этом случае доступно лишь значение очередного элемента массива, но не его ключ. Это может быть полезно, например, для работы с массивами-списками:

<?php
$names[] = "Андрей";
$names[] = "Борис";
$names[] = "Сергей";
$names[] = "Федор";
foreach ($names as $value) {
echo "<b>$value</b><br>";
}
?>

Внимание: Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть “видны” из тела цикла. Что позволяет, например, в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз — до начала цикла, а затем работа будет производиться с копией возвращенного значения).

Конструкция break

Очень часто для того, чтобы упростить логику какого-нибудь сложного цикла, удобно иметь возможность его прервать в ходе очередной итерации (к примеру, при выполнении какого-нибудь особенного условия). Для этого и существует конструкция break, которая осуществляет немедленный выход из цикла. Она может задаваться с одним необязательным параметром — числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения. Синтаксис конструкции break:

break; // По умолчанию
break(номер_цикла); // Для вложенных циклов (указывается номер прерываемого цикла)

Приведем примеры:

<?php
$x=0;
while ($x++<10) {
if ($x==3) break;
echo "<b>Итерация $x</b><br>";
}
// Когда $x равен 3, цикл прерывается
?>

Рассмотренный сценарий выводит:

Итерация 1
Итерация 2

Если нам нужно прервать работу определенного (вложенного) цикла, то нужно передать конструкции break параметр — номер_цикла, например, break(1). Нумерация циклов выглядит следующим образом:

for (...) // Третий цикл
{
for (...) // Второй цикл
{
for (...) // Первый цикл
{
}
}
}

Конструкция continue

Конструкция continue так же, как и break, работает только “в паре” с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления.
В основном continue позволяет вам сэкономить количество фигурных скобок в коде и увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям. Приведем пример использования конструкции continue:

<?php
$x=0;
while ($x++<5) {
if ($x==3) continue;
echo "<b>Итерация $x</b><br>";
}
// Цикл прервется только на третьей итерации
?>

Рассмотренный скрипт выводит:

Итерация 1
Итерация 2
Итерация 4
Итерация 5

Грамотное использование break и continue позволяет заметно улучшить “читабельность” кода и количество блоков else.

--

--