Тема 4. Ветвления и циклы

Опубликовано пользователем Бессонов Л.В. 08.02.2010г.

Оператор ветвления

В операторе if ставиться условие, если оно выполняется, то выполняется часть кода следующая в фигурных скобках за ним, если нет, то часть кода идущая после оператора else. Также можно создавать сложные условия с помощью elseif. Схематично выглядит так:

  1. if(условие){
  2.  
  3. ...
  4.  
  5. }elseif(другое условие){
  6.  
  7. ...
  8.  
  9. }else{
  10.  
  11. ...
  12.  
  13. }
  14. ?>

По-русски это звучит так: «Если условие выполняется, то выполняется одно, если нет, то что-то другое». Сдледующий вопрос — это как создавать условия. Для этого используются переменные и операторы сравнения. Например, так:

  1. <?php
  2.  
  3. $a = 5;
  4. $b = 6;
  5. $c = 5;
  6.  
  7. if($a != $b && $b > $c) {
  8.  
  9. echo "Условие выполняется";
  10.  
  11. }else{
  12.  
  13. echo "Условие не выполнилось";
  14.  
  15. }
  16.  
  17. ?>

Оператор выбора

Этот оператор позволяет делать более сложные ветвления, чем if, более простым способом. На самом деле, при помощи if можно полностью заменить этот оператор, но знать про него полезно.

Итак, этот оператор называется switch. В дословном переводе — »переключатель«. Рассмотрим на примере. Пусть нужно вывести день недели по его порядковому номеру.

  1. <?php
  2. // $iDayNum получено ранее
  3. switch($iDayNum)
  4. {
  5. case 1:
  6. print "Понедельник";
  7. break;
  8. case 2:
  9. print "Вторник";
  10. break;
  11. case 3:
  12. print "Среда";
  13. break;
  14. case 4:
  15. print "Четверг";
  16. break;
  17. case 5:
  18. print "Пятница";
  19. break;
  20. case 6:
  21. print "Суббота";
  22. break;
  23. case 7:
  24. print "Воскресенье";
  25. break;
  26. default:
  27. print "Какая-то ошибка!";
  28. }
  29. ?>

При входе в оператор switch, сначала вычисляется выражение, стоящее в скобках. Затем перебираются все значения, указанные при помощи case. В данном примере мы видим 7 разных значений. Соответственно, когда значение, которое имеет вычисленное в скобках выражение, найдено у какого-либо case, начинается исполнение участка когда внутри case. И вот здесь важно понимать, что означает "внутри case". Когда соответствующее значение найдено, произойдет исполнение всего, что есть дальше того case, которому соответствует значение. И это значит, что если после этого case есть другие, они тоже будут выполнены. Этот эффект алгоритмически обоснован и часто нужен. Но часто он и не нужен.

В таком случае можно воспользоваться оператором break. Он позволяет выйти из оператора switch. Поставив его после кода, записанного внутри каждого case, мы обеспечим себе исполнение только одного участка кода для каждого значения.

Кроме этого, у оператора switch может быть необязательная часть default. Код в ней выполнится, если значение выражения не совпало ни с одним из значений в case.

Это очень похоже на часть else для оператора if .. elseif .. else Но не стоит забывать, что switch и if — не одно и то же. Иногда может пригодиться возможность switch исполнять весь участок кода, включая другие case, после того как найдено совпадение.

Циклы

В PHP реализованы стандартные алгоритмические конструкции: цикл с предусловие (while), цикл с постусловием (do...while), цикл for. Кроме того, есть некоторые неклассические циклы, например, цикл по элементам нескалярной переменной (foreach).

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

Цикл while — простейший тип цикла. Он действует как и его аналог в Си. Основная форма оператора while:

  1. while (условие) {
  2. ...
  3. }

Смысл оператора while прост. Он предписывает PHP выполнять вложенный(е) оператор(ы) до тех пор пока условие выполняется. Значение выражения проверяется каждый раз при начале цикла, так что если значение выражения изменится внутри цикла, то он не прервется пока не начнется следующий цикл. Иногда, если условие не выполняется с самого начала, цикл не выполняется ни разу.

Если в цикле только один оператор, то фигурные скобки можно опустить.

  1. while (условие) оператор;

Следующий пример выводит номера с 1 до 10:

  1. <?php
  2. $i = 1;
  3.  
  4. while ($i <= 10) {
  5.  
  6. print $i;
  7. $i++;
  8.  
  9. }
  10. ?>

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

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

Для циклов do..while существует только один вид синтаксиса:

  1. <?php
  2. $i = 0;
  3.  
  4. do {
  5.  
  6. print $i;
  7.  
  8. } while ($i > 0);
  9. ?>

Этот цикл выполнится один раз, так как после окончания условие не выполнится ($i не больше 0), и выполнение цикла завершится.

Кроме того, Вы можете также использовать еще один интересный оператор в циклах — break. C помощью него можно в любой момент оборвать любой цикл, как while, do..while, так и for или foreach. Например:

  1. <?php
  2. $i = 1;
  3.  
  4. while ($i <= 10) {
  5.  
  6. print $i;
  7. $i++;
  8.  
  9. if($i > 5) break;
  10.  
  11. }
  12. ?>

В данном случе цикл оборвется, когда переменная $i станет равной 6.

Цикл for

Циклы for — наиболее мощные циклы в PHP. Они также работают подобно их аналогам в Си.

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

  1. for (инструкция инициализации; условие; шаговая инструкция){
  2. ...
  3. }

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

Рассмотрим такой пример:

  1. <?php
  2. for ($i=1; $i<=10; $i++){
  3. print $i;
  4. }
  5. ?>

Пример сводит for к классическому циклу со счётчиком (переменная $i меняется от 1 до 10 с шагом 1). Но на деле цикл for может быть устроен и сложнее. Каждый из его параметров может быть пустым. Если условия нет, то цикл продолжается бесконечно (PHP по умолчанию считает условие выполнившимся (равным TRUE), как и Си). Это не так бесполезно, как могло бы показаться, так как зачастую требуется закончить выполнение цикла используя оператор break в сочетании с логическим условием вместо использования логического выражения в for.

Рассмотрим следующие примеры. Все они выводят номера с 1 по 10 :

  1. <?php
  2.  
  3. // Пример 1
  4. for ($i = 1; $i <= 10; $i++) {
  5. print $i;
  6. }
  7.  
  8. // Пример 2
  9. for ($i = 1;;$i++) {
  10. if ($i > 10) break;
  11. print $i;
  12. }
  13.  
  14. // Пример 3
  15. $i = 1;
  16. for (;;) {
  17. if ($i > 10) break;
  18. print $i;
  19. $i++;
  20. }
  21.  
  22. // Пример 4
  23. for ($i = 1; $i <= 10; print $i, $i++);
  24. ?>

Цикл по элементам

Цикл по элементам (foreach) очень удобен для обработки массивов (и других структурированных данных). Выглядит он очень просто. Для примера рассмотрим код, который выводит все элементы обычного массива:

  1. <?php
  2. // $m что-либо содержит, это массив
  3. foreach($m as $item)
  4. {
  5. print $item."\n";
  6. }
  7. ?>

Этот цикл пробегается по всему массиву. А текущий элемент массива доступен в переменной $item.

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

  1. <?php
  2. // $m что-либо содержит, это массив
  3. foreach($m as $key=>$value)
  4. {
  5. print "Элемент массива '".$key."' равен: ".$value."\n";
  6. }
  7. ?>

Конструкция лишь немного усложнилась — в скобках мы указываем ключ=>значение. И соответствующие ключ и значение текущего элемента массива в теле цикла доступны как переменные $key и $value.

Ещё немного о прерывании циклов

Мы уже пользовались оператором break. Рассмотрим его более подробно.

Оператор break принимает параметр — вложенность. Рассмотрим пример с вложенным циклом.

  1. <?php
  2. for($i=1;$i<=9;$i++)
  3. {
  4. for($j=1;$j<=10000;$j++)
  5. {
  6. print ($i*$j)." ";
  7. if($j==9)
  8. {
  9. break(2);
  10. }
  11. }
  12. }
  13. ?>

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

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

  1. <?php
  2. for($i=1;$i<=9;$i++)
  3. {
  4. for($j=1;$j<=11;$j++)
  5. {
  6. if($j>9)
  7. {
  8. continue;
  9. }
  10. print ($i*$j)." ";
  11. }
  12. print "<br />\n";
  13. }
  14. ?>

Баннер SGU.RU