PHP/Циклы

Материал из Викиверситета
< PHP

Любой PHP-код представляет собой совокупность определенных конструкций: операторов, циклов и функций.

Логические выражения, используемые в конструкциях языка PHP, в частности в циклах, были описаны на предыдущей странице, вернуться и почитать можно тут: Условные операторы.

Циклы[править]

Циклы необходимы, когда требуется повторить определенное/неопределенное количество раз набор операторов. Набор таких операторов называется телом цикла и выделяется фигурными скобками. Один проход цикла называется итерацией. Существуют четыре вида циклов, они представлены ниже.

Цикл с предусловием while[править]

Данная конструкция имеет вид

<?php
while (логическое выражение)
{
    инструкция;
}
?>

Итак, сначала вычисляется значение логического выражения. Если значение равно true, то выполняется тело цикла, в противном случае происходит выход из цикла.

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

<?php
while (логическое выражение)
    оператор1;
?>

Пример:

<?php
$count = 7;
while ($count < 10)
{
    print('*');
    $count++;
}
?>

В данном примере мы инициализируем переменную $count значением 7. Затем в цикле, пока значение переменной меньше 10, выполняем две операции: печатаем на экран звездочку и увеличиваем значение переменной $count на 1. Рассмотрим пошагово:

Перед циклом инициализируем переменную $count = 7

Сравниваем значение переменной 7 < 10 - true -> заходим в цикл

Итерация 1:

печатаем звездочку

увеличиваем значение переменной -> $count = 8

Снова сравниваем значение переменной 8 < 10 - true -> остаемся в цикле

Итерация 2:

печатаем звездочку

увеличиваем значение переменной -> $count = 9

Сравниваем значение переменной 9 < 10 - true -> остаемся в цикле

Итерация 3:

печатаем звездочку

увеличиваем значение переменной -> $count = 10

Сравниваем значение переменной 10 < 10 - false -> выходим из цикла

Таким образом, в результате работы программы на экран будет выведена строка: ***

Цикл с постусловием do while[править]

Данная конструкция имеет вид

<?php
do
{
    инструкция;
}
while (логическое выражение);
?>

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

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

<?php
do
    оператор1;
while (логическое выражение);
?>

Пример:

<?php
$count = 10;
do
{
    print('*');
    $count++;
}
while ($count < 10);
?>

Инициализируем переменную $count значением 10. Заходим в цикл и выполняем две операции: печатаем на экран звездочку и увеличиваем значение переменной $count на 1. Значение переменной $count стало равным 11, проверяем условие ($count < 10) - false -> выходим из цикла. В результате работы программы на экране отобразится следующая строка: *

Цикл со счетчиком for[править]

Данная конструкция имеет вид

<?php
for (инициализирующая команда; условие цикла; команда после итерации) 
{ 
    инструкция; 
}
?>

или

<?php
for (инициализирующая команда; условие цикла; команда после итерации) 
    оператор1; 
?>

Цикл со счетчиком for применяется для выполнения тела цикла определенное число раз. Работа цикла начинается с выполнения инициализирующих команд(выполняются единожды). Далее проверяется условие цикла, если оно истинно(true), то выполняется тело цикла. Затем выполняются команды после итерации и снова проверяется условие цикла. Если оно ложно(false), происходит выход из цикла.

Пример:

<?php
for ($x=1; $x<6; $x++) 
    echo $x;
?>

В результате работы следующего скрипта на экран будет выведена строка: 12345

Цикл перебора массивов foreach[править]

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

Сама конструкция имеет вид

<?php
foreach ($массив as $обозначение)
{ 
    инструкция; 
}
?>

или

<?php
foreach ($массив as $обозначение) 
    оператор1; 
?>

Заметим, что $обозначение - это переменная, обозначающая просматриваемый элемент, мы вправе дать ей любое имя и обращаться к ней в теле цикла.

Пример:

<?php
$array = array(1, 2, 3, 4, 5);

foreach ($array as $var) 
    echo "$var "; 
?>

В данном скрипте мы сперва инициализируем массив, состоящий из пяти элементов(числа от 1 до 5), далее для каждого элемента выполняем печать на экран. В результате чего на экране получаем строку: 1 2 3 4 5

Конструкция break[править]

Конструкция, позволяющая прервать выполнение цикла в ходе очередной итерации.

Пример:

<?php
$x = 3;
while (true) 
{
    $x--;
    if ($x < 0) 
    {
        echo 'Значение $x оказалось меньше нуля';
        break;
    }
    echo "$x \n";
}
?>

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

Циклы могут быть вложенными, в таком случае используется break вместе с номером прерываемого цикла.

<?php
while (...) //внешний цикл
{
    while (...) //внутренний цикл
    {
        break; //Прервет выполнение внутреннего цикла
        break 2; //Прервет выполнение внешнего цикла
    }
    
    break; //Прервет выполнение внешнего цикла
    break 2; //Вызовет ошибку, поскольку текущий цикл не вложен ни в какой другой
}
?>

Конструкция continue[править]

Конструкция, позволяющая перейти к следующей итерации цикла.

Пример:

<?php
$array = array(1, 2, 3, 4, 5);

foreach ($array as $var)
{
    if ($var == 3) continue;
    echo "$var "; 
}
?>

В данном скрипте мы сперва инициализируем массив, состоящий из пяти элементов(числа от 1 до 5), далее в цикле проверяем не равен ли текущий элемент трём и выполняем печать на экран. Если встретился элемент равный трём, то переходим к следующей итерации, то есть к следующему элементу. В результате чего на экране получаем строку: 1 2 4 5

Аналогично break, для continue можно указать уровень вложенности цикла.

Упражнения[править]

1 Сколько символов * отобразятся на экране после выполнения следующего скрипта?

<?php
$count = 1;
while ($count == 3)
{
    echo '*';
    $count++;
    if ($count == 2) continue;
} //
?>

0, код отработает с ошибкой
1
2
3

2 Сколько символов * отобразятся на экране после выполнения следующего скрипта?

<?php
$count = 11;
do
{
    echo '*';
    $count++;
} //
while ($count < 0);
?>

0, код отработает с ошибкой
1
2
3

3 Сколько символов * отобразятся на экране после выполнения следующего скрипта?

<?php
$count = 11;
do
{
    break;
    echo '*';
    $count++;
} //
while ($count < 15);
?>

0
1
2
3
4

4 Что будет напечатано на экране после выполнения следующего скрипта?

<?php
$array = array(1, 2, 3, 4, 5, 6);
for ($x=1; $x<4; $x++) 
    echo $array[2*$x - 1];
?>

123456
135
246
123

5 Что будет напечатано на экране после выполнения следующего скрипта?

<?php
$array = array(1, 2, 3, 4, 5);

foreach ($array as $var) 
{
    if ($var % 2 == 0) continue;
    echo "$var "; 
} //
?>

1 3 5
2 4 6
1 2 3 4 5
ошибка


Ссылки[править]