Пятница, 17.05.2024, 01:10
DigitalBox
Приветствую Вас Гость | RSS
Главная Использование циклов Регистрация Вход
Меню сайта

Использование циклов



Циклы очень часто используются в сценариях для многократного выполнения некоторых действий. При этом операции цикла повторяются либо некоторое наперед заданное количество раз, либо до выполнения определенных условий. Например, цикл, который выводит сокращенные названия штатов с помощью функции echo, необходимо повторить 50 раз, а цикл, который выводит имена файлов в каталоге, — пока не будут обработаны все файлы (независимо от их количества). В языке РНР существуют три типа циклов:

  • for. Проверяет значение счетчика цикла и повторяет действия до тех пор, пока счетчик цикла не достигнет определенного значения.
  • whilе. Проверяет условие и выполняет действия, пока условие не станет ложным.
  • do. .while. Выполняет действия и только потом проверяет условие. Еcли оно истинно— операторы цикла повторяются, в противном случае цикл прекращается.

В следующих разделах эти виды циклов рассматриваются более подробно.


Цикл for

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

for (начальное_значение; конечное_условие; инкремент)
{
     фрагмент кода;
}

Цикл for имеет следующие параметры:

  • начальное_значение. Это выражение определяет переменную-счетчик цикла и инициализирует ее начальным значением. Например, выражение $i=1 указывает, что в качестве счетчика будет использоваться переменная $i, а ее начальное значение равно 1. Обычно счетчик начинается с 0 или 1. При этом в качестве начального значения можно использовать число, числовое выражение (например, 2+2) или значение переменной.
  • конечное_условие. Это выражение определяет конечное значение счетчика. Цикл выполняется до тех пор, пока счетчик не достигнет этого значения. Рассмотрим, например, выражение $i<10, которое устанавливает конечное значение, равное 10. При достижении переменной $i этого значения цикл прекращается, поскольку условие $i<10 уже не будет выполняться. Выражение конечное_условие может также иметь вид $i<$size;.
  • инкремент. Выражение, которое определяет, на какую величину будет изменяться счетчик. Например, выражение $i++; будет увеличивать значение переменной $i на единицу после выполнения каждой итерации (блока цикла). Можно также использовать такие выражения, как $i=+1; или $i--;

В цикле for в качестве счетчика используется некая переменная, скажем $i, значение которой изменяется в процессе выполнения цикла. При этом переменную-счетчик $i можно также использовать внутри цикла. Рассмотрим пример, в котором строка Здравствуй, мир! выводится три раза:

for ($i=1; $i<=3; $i++)
{
     echo "$i. Здравствуй, мир!<br>";
}

Операторы тела цикла необязательно вводить с отступом. Для интерпретатора РНР это не имеет значения. Отступ используется для лучшего понимания кода сценария.

В результате получим следующее:

1. Здравствуй, мир!
2. Здравствуй, мир!
3. Здравствуй, мир!


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

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

for ($i=1; $i<=9; $i++)
{
     echo "\nУмножение на $i \n" ;
     for($j=1; $j<=9; $j++)
     {
          $result = $i * $j;
          echo "$i x $j = $result\n";
     }
}

В результате получим следующий результат:

Умножение на 1
1 x 1 = 1
1 x 2 = 2
.....
1 x 8 = 8
1 x 9 = 9
Умножение на 2
2 x 1 = 2
2 x 2 = 4
.....
2 х 8 = 16
2 х 9 = 18
Умножение на 3
3 x 1 = 3
и так далее.


Усложненные циклы for

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

for (начальное выражение; условное выражение; заключительное выражение)
{
     фрагмент кода;
}

Параметры рассмотренного цикла for имеют следующее назначение:

  • Начальное выражение выполняется безусловно, один раз, до начала цикла. Оно может включать присваивание начального значения или любое другое выражение, которое требуется выполнять перед началом цикла.
  • Условное выражение проверяется на истинность перед началом каждой итерации цикла.
  • В конце каждой итерации цикла выполняется заключительное выражение. Оно может включать инкремент счетчика цикла или любое другое действие, которое выполняется после каждой итерации цикла.

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

$t = 0;
for ($i=0, $j=1; $t<=4; $i++, $j++)
{
     $t = $i + $j;
     echo "$t<br>";
}

В качестве начального выражения используется $i=0, $j=1, в качестве условного — $t<=4, заключительного — $i++, $j++. Результат выполнения приведенного фрагмента будет иметь следующий вид:

1
3
5

Теперь рассмотрим более подробно процесс выполнения этого цикла:

  1. Выполняется начальное выражение. При этом переменной $i присваивается значение 0, а переменной $j — 1.
  2. Проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку это так, то условие истинно и цикл продолжает выполняться.
  3. Выполняются действия внутри тела цикла. Значение переменной $t вычисляется как сумма $i и $j (0+1 равно 1) и с помощью функции echo выводится на экран.
  4. В конце данной итерации выполняется заключительное выражение: $i++ и $j++. Значения переменных $i и $j увеличиваются на единицу и становятся равными 1 и 2.
  5. В начале следующей итерации проверяется условное выражение. Не превышает  ли значение переменной $t числа 4? Поскольку текущее значение $t равно 1, то условие истинно и цикл продолжает выполняться.
  6. Выполняются действия внутри цикла. Значение переменной $t вычисляется как сумма $i и $j (1+2 равно 3) и с помощью функции echo выводится на экран.
  7. В конце данной итерации выполняется заключительное выражение: $i++ и $j++. Значения переменных $i и $j увеличиваются на единицу и становятся равными 2 и 3.
  8. В начале следующей итерации проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку текущее значение $t равно 3, то условие верно и цикл продолжает выполняться.
  9. Выполняются действия внутри тела цикла. Значение переменной $t вычисляется как сумма $i и $j (2+3 равно 5) и с помощью функции echo выводится на экран.
  10. В конце данной итерации выполняется заключительное выражение: $i++ и $j++. Значения переменных $i и $j увеличиваются на единицу и становятся равными 3 и 4.
  11. В начале следующей итерации проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку текущее значение $t равно 5, то условие ложно и цикл завершается.

Цикл while

Цикл while выполняет заданные действия до тех пор, пока истинно определенное условие. Этот вид цикла работает следующим образом.

  1. Задается условие.
  2. Это условие проверяется перед началом каждой итерации.
  3. Если условие истинно, цикл продолжает выполняться, в противном случае — завершается.

Общий синтаксис цикла while имеет следующий вид:

while(условие)
{
     фрагмент кода;
}

В следующем примере цикл while используется для нахождения в массиве $fruit значения яблоко:

$fruit = array("апельсин" , "яблоко", "виноград");
$testvar = "нет";
$к = 0;
while($testvar != "да" )
{
     if($fruit[$k] == "яблоко" )
     {
          $testvar = "да";
          echo "яблоко\n";
     }
     else
     {
          echo "$fruit[$k] - это не яблоко\п";
     }
     $k++;
}

В результате будет выведено следующее:

апельсин — э то не яблоко
яблоко

Рассмотрим процесс выполнения этого цикла более подробно:

  1. Перед началом цикла инициализируются необходимые переменные. Создается массив $fruit с тремя элементами, тестовая переменная $testvar со значением нети счетчик , принимающий значение 0.
  2. Цикл начинается с проверки на истинность условия $testvar != "да". Поскольку переменной $testvar было присвоено значение нет, условие верно и цикл не завершается.
  3. Проверяется условие в выражении if. Верно ли, что $fruit[$k] == "яблоко"? Текущее значение равно 0, и интерпретатор РНР проверяет на равенство первый элемент массива $fruit[0]. Поскольку в нем содержится значение апельсин, то рассматриваемое условие ложно, т.е. фрагмент кода, содержащийся после if, не выполняется и интерпретатор РНР переходит к обработке инструкции else.
  4. Выполняется фрагмент кода, содержащийся после else. Он выводит первую строку апельсин — это не яблоко.
  5. Значение переменной увеличивается на единицу и становится равным 1.
  6. Достигается конец цикла и интерпретатор РНР переходит к его началу.
  7. Снова проверяется на истинность условие $testvar != "да". Поскольку значение переменной $testvar не изменилось и равно нет, условие истинно и цикл не прекращается.
  8. Опять проверяется условие в выражении if. Верно ли, что $fruit[$k] == "яблоко"? Теперь текущее значение равно 1 и интерпретатор РНР проверяет второй элемент массива $fruit[1]. Поскольку в нем содержится значение яблоко, то рассматриваемое условие истинно, т.е. выполняется фрагмент кода, который следует за if.
  9. Выполняется фрагмент кода после оператора if. В нем переменной $testvar присваивается значение да и выводится вторая строка яблоко.
  10. Значение переменной снова увеличивается на единицу и становится равным 2.
  11. Достигается конец цикла, и интерпретатор РНР снова переходит к его началу.
  12. Последний раз проверяется истинность условия $testvar != "да". Поскольку значение переменной $testvar изменилось и стало равным да, условие ложно и цикл завершается.

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


Цикл do. .while

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

do
{
     фрагмент кода;
}while ( условие );

Перепишем предыдущий пример цикла while с использованием цикла do..while. При этом результат выполнения будет один и тот же:

$fruit = array("апельсин", "яблоко", "виноград");
$testvar = "нет";
$к = 0;
do
{
     if ($fruit[$k] == "яблоко"))
     {
          $testvar = "да";
          echo "яблоко\n";
     }
     else
     {
          echo "$fruit [$k] — это не яблоко\n";
     }
     $к++;
}while ($testvar != "да"));

В результате на экране отобразятся следующие строки:

апельсин — это не яблоко
яблоко

т.е. будет получен тот же результат, что и в предыдущем примере с использованием цикла while. Различие между циклами while и do..while заключается во времени проверки условия. В цикле while условие проверяется перед началом каждой итерации, т.е. если оно всегда ложно, фрагмент кода никогда не выполнится. В цикле do..while условие проверяется после завершения итерации. Поэтому фрагмент кода всегда выполнится хотя бы один раз. Изменим, например, в предыдущих двух циклах, while и do..while, начальное значение переменной $testvar на да:

$testvar = "да";

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

апельсин — это не яблоко

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


Избегайте бесконечных циклов

Нетрудно создать цикл, который будет выполнятся неограниченное количество раз. Такие циклы называются бесконечными (infinite loop). Однако вряд ли кто-то создает их намеренно. Чаще всего — это ошибка в написании кода. Например, небольшое изменение фрагмента кода в примере с циклом while может привести к бесконечному циклу.

Модифицируем код сценария, который использовался ранее в этом разделе:

$fruit = array("апельсин", "яблоко", "виноград");
$testvar = "нет";
while ( $testvar != "да" )
{
     $k = 0;
     if($fruit[$k] == "яблоко" )
     {
          $testvar = "да";
          echo "яблоко\n";
     }
     else
     {
          echo "$fruit[$k] — это не яблоко\п";
     }
     $k++;
}

Небольшое изменение касается выражения $k=0;, которое было внесено в цикл while извне. Эта модификация делает цикл бесконечным. В результате получим:

апельсин — это не яблоко
апельсин — это не яблоко
апельсин — это не яблоко
апельсин — это не яблоко
..........

и так до бесконечности. При каждой новой итерации переменной $k присваивается значение 0 (несмотря на инкремент в конце цикла), и каждый раз проверяется первый элемент массива $fruit[0], содержащий значение апельсин, т.е. второй элемент массива (со значением яблоко) никогда не будет обработан, и значение переменной $testvar никогда не станет равным да. Таким образом, в результате получим бесконечный цикл.

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

  • При использовании РНР для создания Web-страниц. Подождите, пока сценарий сам не остановится через короткое время. По умолчанию оно paвно 30 секундам, но может быть изменено администратором. Или щелкните на кнопке Стоп (Stop) в браузере, чтобы остановить выполнение сценария.
  • При использовании PHP CLI. Нажмите комбинацию клавиш <Ctrl+C>. Это поможет остановить выполнение сценария. Хотя некоторое время он еще может поработать, но остановится обязательно.

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

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

while($testvar = "да")

В нем переменной $testvar присваивается значение да. Это выражение никогда нe станет ложным. Здесь, наверное, подразумевалось следующее:

while ($testvar == "да")

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

Еще одной ошибкой является отсутствие выражения, которое изменяет значение переменной-счетчика. Например, если в предыдущем примере кода удалить инкремент счетчки $k++;, то значение переменной $k будет неизменным и равным 0 и в результате получится бесконечный цикл.


Прерывание циклов

Иногда необходимо прервать выполнение цикла. В языке РНР это можно сделать двумя способами:

  • Оператор break полностью прерывает выполнение цикла.
  • Оператор continue прерывает выполнение текущей итерации и переходит к следующей, если соответствующее условие выполнено.

Операторы break и continue обычно применяются в условных операторах. В частности, инструкция break чаще всего используется в конструкции switch. В следующих примерах показано различие в использовании операторов break и continue. Приведем пример использования оператора break:

$counter = 0;
while ( $counter <5 )
{
     $counter++;
     if($counter == 3)
     {
          echo "break\n";
          break;
     }
     echo "Последняя строка цикла: счетчик=$counter\n";
}
echo "Первая строка после цикла\n\n";

Получим следующий результат:

Последняя строка цикла: счетчик=1
Последняя строка цикла: счетчик=2
break
Первая строка после цикла

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

$counter = 0;
while ( $counter <5 )
{
     $counter++;
     if($counter == 3)
     {
          echo "continue\n";
          continue;
     }
     echo "Последняя строка цикла: счетчик=$counter\n";
}
echo "Первая строка после цикла\n";

Получим следующий результат:

Последняя строка цикла: счетчик=1
Последняя строка цикла: счетчик=2
continue
Последняя строка цикла: счетчик=4
Последняя строка цикла: счетчик=5
Первая строка после цикла

В отличие от примера с использованием оператора break при достижении оператора continue цикл не завершается. Просто выполнение третьей итерации прерывается и происходит переход к следующей. Цикл завершается тогда, когда условие становится ложным (т.е. когда значение переменной $counter станет больше 5).

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

$test4infinity++;
if($test4infinity >100)
{
     break;
}

Если известно, что цикл не должен повторяться больше 100 раз, приведенный фрагмент кода поможет избежать создания бесконечного цикла.

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz