Повторение действий, циклы

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

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

Таблица стоимости доставки может выглядеть так, как показано на рис. 1.7.

Повторение действий с помощью итераций

HTML-код, выводящий эту таблицу, представлен в листинге 1.2. Несложно убедиться, что многие фрагменты этого достаточно длинного кода многократно повторяются.

Повторение действий, циклы

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

Операторы цикла указывают РНР о необходимости многократного выполнения того или иного оператора или блока операторов.

Циклы while

Простейшим видом цикла в РНР является, пожалуй, цикл while. Подобно оператору if, в основе этого оператора лежит проверка условия. Различие между циклом while и оператором if состоит в том, что если условие принимает значение true, оператор if выполняет следующий за ним блок кода только один раз. Цикл while выполняет блок операторов многократно, пока условие продолжает быть равным true.

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

Базовая структура цикла while имеет следующий вид:

while (условие) выражение;

Показанный ниже цикл while выводит на экран числа от 1 до 5.

$num =1;

while ($num <= 5) {

echo $num."<br />";

$num++;

}

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

Цикл while можно использовать для выполнения чего-то более полезного, например, для отображения повторяющейся таблицы стоимости доставки, которая была показана на рис. 1.7.

В листинге 1.3 цикл while используется для построения таблицы стоимости доставки.

Циклы

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

Циклы for и foreach

Описанный в предыдущем разделе способ использования циклов while является достаточно общеупотребительным. Сначала устанавливается начальное значение счетчика. Перед каждой итерацией значение счетчика проверяется внутри условия. В конце каждой итерации значение счетчика изменяется.

Цикл подобного типа можно записать и в более компактной форме с использованием оператора for.

Базовая структура цикла for имеет следующий вид:

for (выражение1; условие; выражение2)

выражение3;

Выражение1 выполняется один раз в начале цикла. Обычно в нем устанавливается начальное значение счетчика.

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

Выражение2 выполняется в конце каждой итерации. Обычно в нем изменяется значение счетчика.

ВыражениеЗ выполняется один раз во время каждой итерации. Обычно это выражение представляет собой блок кода и содержит собственно тело цикла.

Пример цикла while, представленный в листинге 1.3, можно переписать с использованием цикла for. РНР-код примет следующий вид:

<?php

for ($distance = 50; $distance <= 250; $distance += 50) {

echo "<tr>

<td align=\"right\">".$distance."</td>

<td align=\"right\">". ($distance / 10) ."</td>

</tr>\n";

}

?>

В функциональном смысле циклы while и for идентичны. Однако цикл for имеет несколько более компактную форму и содержит на две строки меньше.

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

Попутно отметим, что можно объединять переменные переменных и циклы for для организации итераций по последовательности повторяющихся полей формы. Например, при наличии полей формы с такими именами, как, скажем, name1, name2, name3 и т.д., их можно обрабатывать следующим образом:

for ($i=1; $i <= $numnames; $i++) {

$temp= "name$i";

echo $$temp.'<br />'; // здесь может быть любая другая обработка

}

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

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

Циклы do..while

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

do

выражение;

while (условие) ;

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

Даже в приведенном ниже примере, где условие с самого начала имеет значение false и никогда не может принять значение true, цикл выполнится один раз до того, как условие будет проверено и цикл завершится.

$num = 100;

do {

echo $num."<br />";

} while ($num < 1) ;