PHP: Циклы

В этой главе:

  • Оператор цикла while

  • Оператор цикла do while

  • Оператор цикла for

  • Цикл for без частей заголовка

  • Несколько выражений в заголовке цикла for

  • Вложенные циклы

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

Каждый цикл состоит из двух основных частей. Первая определяет, когда должно быть остановлено исполнение цикла. Вторая - собственно фрагмент программного кода, выполняющий необходимые действия, который может состоять из одной единственной инструкции или из нескольких инструкций, заключенных в фигурные скобки.

Программный код цикла исполняется до тех пор, пока условное выражение цикла возвращает значение TRUE. Чтобы избежать бесконечного цикла, который будет крутиться вечно, код тела цикла должен заставить условное выражение в определенный момент вернуть значение FALSE. Когда это произойдет, работа цикла прекратится, и исполнение продолжится со строки кода, расположенной непосредственно после цикла.

Оператор цикла while

Цикл while является простейшим видом цикла в PHP. Его синтаксис:

синтаксис цикла while в PHP

Ниже приводится пример цикла while, тело которого исполняется 10 раз:

1
2
3
4
5
6
7
8
9
10
11
<?php
 
  $num = 1;
   
  while ($num <= 10) {
    echo "Итерация номер: $num<br>\n";
     
    $num++;
  }
 
?>

Перед началом цикла значение переменной $num устанавливается равным 1 (значение может быть любым). Это называется инициализацией переменной-счетчика. Каждый раз, когда исполняется тело цикла, с помощью инкремента $num++ значение переменной $num увеличивается на единицу. Значение выражения ($num <= 10) проверяется каждый раз перед итерацией цикла. После десяти итераций условное выражение вернет значение FALSE (так как значение переменной $num уже будет не меньше или равно 10) и работа цикла прекратится. В том случае, если условное выражение while будет равно FALSE с самого начала, тело цикла ни разу не будут выполнено.

Большинство циклов имеют переменные-счетчики, аналогичные $num. Чаще всего в качестве счетчиков цикла выступают переменные с именами i, j и k, хотя для того чтобы сделать программный код более понятным, следует давать счетчикам более наглядные имена.

Оператор цикла do while

Цикл do while очень похож на цикл while, с тем отличием, что условное выражения проверяется в конце итерации, а не в начале. Синтаксис этого цикла:

синтаксис цикла do while в PHP

Между циклом do while и обычным циклом while имеется два отличия. Во-первых, цикл do требует как ключевого слова do (для отметки начала цикла), так и ключевого слова while (для отметки конца цикла и указания условия). Во-вторых, в отличие от цикла while, цикл do завершается точкой с запятой. Данная разновидность цикла полезна, когда тело цикла должно быть исполнено хотя бы один раз, независимо от значения условного выражения.

Попробуем выполнить те же самые действия, что и в предыдущем примере:

1
2
3
4
5
6
7
8
9
10
11
<?php
 
  $num = 1;
 
  do {
    echo "Итерация номер: $num<br>\n";
     
    $num++;
  } while ($num <= 10);
   
?>

Оператор цикла for

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

синтаксис цикла for в PHP

Данный цикл состоит из ключевого слова for, за которым следуют круглые скобки, содержащие внутри три выражения, разделенных точками с запятой. Он имеет следующий порядок выполнения:

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

  2. Далее следует условное выражение. Перед началом каждой итерации вычисляется значение условного выражения (условие выполнения), если оно принимает значение TRUE, то тело цикла выполняется, если оно принимает значение FALSE, выполнение цикла завершается. Если при первой проверке условие оказывается ложным, тело цикла не выполнится ни разу.

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

Простой пример цикла for:

1
2
3
4
5
6
7
<?php
 
  for ($k = 1; $k <= 10; $k++) {
    echo "$k ";
  }
   
?>

На самом деле цикл for является почти универсальным, поскольку он допускает самые разные варианты своего применения.

Цикл for без частей заголовка

Каждое из выражений в заголовке цикла for может отсутствовать.

Если инициализация не нужна или происходит в другом месте, инициализирующее выражение не нужно. Перепишем немного предыдущий пример:

1
2
3
4
5
6
7
8
9
<?php
   
  $k = 1;
 
  for (; $k <= 10; $k++) {
    echo "$k ";
  }
   
?>

Обратите внимание, символ точки с запятой обязателен, так как означает отсутствующее выражение. Отсутствие выражения условия эквивалентно расположению в условии значения TRUE.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
  for ($k = 1;/* нет условия */; $k++) {
    echo "$k ";
  }
   
  // Это эквивалентно следующему коду
  for ($k = 1; true; $k++) {
    echo "$k ";
  }
   
?>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
  for ($k = 1; $k <= 10; /* нет выражения */) {
    echo "$k ";
    // значение переменной $k должно изменяться в теле цикла
    // иначе он не завершится
     
    $k++;
  }
   
  // можно убрать все выражения, получив бесконечный цикл
  for (;;) {
    //...
  }
   
?>

Не стоит забывать о том, что любое из трех выражений или все сразу можно опустить, но разделительные точки с запятой (;) следует ставить всегда.

Несколько выражений в заголовке цикла for

В заголовке цикла for каждое выражение разделенное точкой с запятой может содержать по несколько выражений, разделенных запятыми. Поэтому можно использовать выражения любой сложности.

1
2
3
4
5
6
7
<?php
 
  for ($bar = 10, $foo = 1; $foo <= 10; $bar--, $foo++) {
    echo "\$foo: $foo \$bar: $bar<br>";
  }
   
?>

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

1
2
3
4
5
6
7
8
<?php
 
  // не выполнится так как последнее выражение false
  for ($k = 1; $k <= 10, false; $k++) {
    echo "$k ";
  }
   
?>

Вложенные циклы

Так же как и условные операторы, циклы могут быть вложенными. Простой пример с одним уровнем вложенности:

1
2
3
4
5
6
7
8
9
10
<?php
 
  for ($i = 0; $i < 4; $i++) {
    echo "Внешний цикл.<br>";
    for ($j = 0; $j < 2; $j++) {
      echo "Вложенный цикл.<br>";
    }
  }
   
?>

В PHP есть еще один оператор цикла - foreach, но его описание мы отложим на потом, так как он предназначен для работы с массивами и объектами.