Курс "Язык программирования PHP" - страница 17

стр.


Например, все четные цифры можно вывести с использованием цикла for таким образом:


>

>for ($i=0; $i<10; $i++){

> if ($i % 2 == 0) print $i;

> // печатаем четные числа

>}

>?>


Если опустить второе выражение (условие $i<10), то такую же задачу можно решить, останавливая цикл оператором break.


>

>for ($i=0; ; $i++){

> if ($i>=10) break;

> // если $i больше или равно 10,

> // то прекращаем работу цикла

> if ($i % 2 == 0) print $i;

> // если число четное,

> // то печатаем его

>}

>?>


Можно опустить все три выражения. В этом случае просто не будет задано начальное значение счетчика $i и оно не будет изменяться каждый раз в конце цикла. Все эти действия можно записать в виде отдельных команд либо в блоке_выполнения, либо перед циклом:


>

>$i=0; // задаем начальное значение счетчика

>for ( ; ; ){

> if ($i>=10) break;

> // если $i больше или равно 10,

> // то прекращаем работу цикла

> if ($i % 2 == 0) print $i;

> // если число четное,

> // то печатаем его

>$i++; // увеличиваем счетчик на единицу

>}

>?>


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


>

>for ($i=0; $i<10; print $i, $i++)

>/* Если блок_выполнения не содержит команд

>или содержит только одну команду,

>фигурные скобки, в которые он заключен,

>можно опускать*/

>?>


foreach


Еще одна полезная конструкция. Она появилась только в PHP4 и предназначена исключительно для работы с массивами.


Синтаксис:


>foreach ($array as $value) {блок_выполнения}


либо


>foreach ($array as $key => $value)

> {блок_выполнения}


В первом случае формируется цикл по всем элементам массива, заданного переменной $array. На каждом шаге цикла значение текущего элемента массива записывается в переменную $value, и внутренний счетчик массива передвигается на единицу (так что на следующем шаге будет виден следующий элемент массива). Внутри блока_выполнения значение текущего элемента массива может быть получено с помощью переменной $value. Выполнение блока_выполнения происходит столько раз, сколько элементов в массиве $array.


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


Когда foreach начинает исполнение, внутренний указатель массива автоматически устанавливается на первый элемент.


>

>$names = array("Иван","Петр","Семен");

>foreach ($names as $val) {

> echo "Привет, $val
";

> // выведет всем приветствие

>}

>foreach ($names as $k => $val) {

> // кроме приветствия,

> // выведем номера в списке, т.е. ключи

> echo "Привет, $val !

> Ты в списке под номером $k
";

>}

>?>


Операторы передачи управления


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


Break


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


>

>$i=1;

>while ($i) {

> $n = rand(1,10);

> // генерируем произвольное число

> // от 1 до 10

> echo "$i:$n ";

> // выводим номер итерации и

> // сгенерированное число

> if ($n==5) break;

>/* Если было сгенерировано число 5,

>то прекращаем работу цикла. В этом случае

>все, что находится после этой строчки

>внутри цикла, не будет выполнено */

> echo "Цикл работает
";

> $i++;

>}

>echo "
Число итераций цикла $i ";

>?>


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


>1:7 Цикл работает

>2:2 Цикл работает

>3:5

>Число итераций цикла 3


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