3.4. Циклы
Циклы позволяют повторять строки программного кода после проверки выполнения определенного условия. Например, необходимо прочесть все строки из файла до его конца. Можно распечатать часть HTML-кода, повторив его десять раз, или запрограммировать три попытки подключения к базе данных, или прочесть данные из файла до его конца. Все эти действия программируются с помощью циклов.
Каждый цикл выполнения кода внутри цикла называется итерацией. Программный код внутри цикла повторяется до тех пор, пока не будет выполнено условие завершения. Язык PHP поддерживает три типа циклов, которые отличаются друг от друга тем, как они осуществляют итерации, какие действия выполняют перед началом цикла и когда осуществляется проверка условия завершения цикла, в начале или в конце цикла.
Оператор while
Простейшим циклом является цикл while. Выражение проверяется сразу же при первом удобном случае. Если это условие является ложным, программный блок просто пропускается, а если условие дает значение "истина", программный блок выполняется, после чего управление передается обратно наверх и опять проверяется условие. На рис. 3.4 показана структура оператора while.
Операторы управления
Цикл while имеет смысл в том случае, когда вы не знаете, сколько итераций должен сделать данный программный код, - так бывает, например, при чтении строк из файла или выборке из базы данных при помощи запроса. Для того чтобы узнать, как это работает, посмотрим на код, распечатывающий названия дней недели, начиная с текущего дня и заканчивая пятницей.
Цикл while (листинг 3.5) проверяет, чтобы дата, хранящаяся в переменной currentDate, не была пятницей (Friday). Если день является пятницей, выполнение цикла завершается и будет продолжено после закрывающих фигурных скобок. Но если сегодня не пятница, то распечатывается элемент списка с названием дня и к переменной currentDate прибавляется 24 часа. В этом месте достигается конец программного блока, и управление передается обратно в начало цикла.
Текущая дата снова проверяется на соответствие пятнице. Вот так постепенно будет достигнута пятница. Соответственно значение переменной currentDate станет пятницей, и цикл будет завершен. Но что будет, если запрограммировать что-то нелогичное, сравнивая, например, текущую дату со значением "Workday"? Дня недели с таким названием не существует, поэтому операция проверки всегда будет давать значение "истина". Это значит, что проверка date("l", $currentDate) != "Workday" всегда даст значение "истина". В результате получаем так называемый вечный цикл. Для достижения аналогичного результата лучше написать while(TRUE), что будет гораздо проще и прозрачнее.

| Листинг 3.5. Использование цикла while для печати названий дней недели_
<?php
// Присвоить переменной $currentDate значение текущей даты в секундах $currentDate = time();
// Напечатать какой-нибудь поясняющий текст print("До пятницы осталось (дней):^"); print("<ol>n");
while(date("l", $currentDate) != "Friday")
{
// Распечатать название дня недели
print("<li>" . date("l", $currentDate) . "</li>n"); // Прибавить к переменной $currentDate 24 часа $currentDate += (60 * 60 * 24);
}
print("</ol>n");
?>

Вечный цикл также называется неопределенным. Если вы вдруг обнаружите, что ваша страница загружается очень медленно, то вполне вероятно, что виной тому будет где-то запрограммированный вами бесконечный цикл. К счастью, машина PHP по умолчанию останавливает любой сценарий, если он занимает больше 30 секунд процессорного времени. Этот тайм-аут можно изменить с помощью функции set_time_limit. Иногда неопределенный цикл может создаваться преднамеренно, и его можно прервать где-то посередине выполнения. Для этих целей вполне может пригодиться оператор break.