Чашечка пятая — повторение - мать учения, повторение - мать
Здравия желаю!
Пользователям The Bat!: для нормального просмотра откройте файл message.html (он находится на специальной панели слева) т.к. сам bat неправильно отображает некоторые элементы рассылки
Для начала поясню одну конструкцию, которая вызвала затруднение у достаточно большого числа подписчиков. В прошлом выпуске, в примере №9 была указана такая строка:
<form action="?form=1">
Вообще, как правило, в свойстве action
тега <form> указывается скрипт, который будет обрабатывать запрос. Но, т.к. в нашем случае форму выводит и обрабатывает один и тот же скрипт, то имя файла я писать не стал, а написал, что у скрипта должен быть параметр form=1. Это всё равно, что мы бы написали:
Что в первом, что во втором случае скрипту уже будет известна переменная с именем $form, значение которой будет равно 1.
А теперь — подробнее о том, что я хочу Вам рассказать на этом уроке… Сегодняшний выпуск посвящён второму по степени важности типу конструкций языка PHP — циклам.
Цикл с предусловием
Таким циклом в PHP является цикл while. Внешний вид цикла:
Пример 1. Внешний вид цикла while:
while (условие) {
// здесь располагаются действия, которые будут
// выполняться до тех пор, пока выполняется условие
}
Всё то, что находится между { и } называется телом цикла
То есть, пока условие выполняется PHP будет выполнять и тело цикла. Вот, например:
Пример 2. Пример цикла while:
$a=1;
while ($a<10) {
echo ($a);
echo ("<br>");
$a++;
}
Посмотрим, как будет действовать PHP:
Присвоит переменной $a значение единица
Проверит условие $a<10?
Т.к. $a всё ещё меньше 10, PHP выполнит команды тела цикла: выведет $a, выведет тег <br> (чтобы цифры были отделены друг от друга) и увеличит $a на единицу.
Перейдёт на второй шаг и снова проверит условие. Так он будет действовать пока условие будет выполняться.
Как только условие нарушилось,
то есть $a стало больше или равно десяти, PHP выйдет из цикла.
Результаты работы показаны на рисунке 1:
Рисунок 1. Результат работы примера 2:
Заметьте, что число 10 выведено не будет, потому что при $a=10 условие $a<10 нарушается, а значит тело цикла выполнено не будет.
А что бы было, если бы вместо первой
строки $a=1; было написано $a=20;? Ответ, я думаю, понятен: тогда бы тело цикла вообще не выполнилось.
Цикл с постусловием
В PHP названием такого цикла — do while. Внешне он похож на while:
Пример 3. Внешний вид цикла do while:
do {
// здесь находится тело цикла
} while (условие);
Главным отличием двух циклов является то, что цикл while сначала проверяет условие, а только потом — выполняет, в то время, как, в цикле do while проверка условия идёт в конце. Посмотрите на пример 2, переработанный для цикла do while:
Пример 4. Пример цикла do while:
$a=1;
do {
echo ($a);
echo ("<br>");
$a++;
} while ($a<10);
Результаты работы двух примеров (примера 2 и примера 4) полностью совпадают (проверьте это самостоятельно).
Однако следует помнить, что это разные циклы и различие их проявляется вот в чём: если в цикле while условие цикла изначально не выполняется, то тело цикла вообще не будет отображено, тогда как в цикле do while тело цикла будет
выполнено один раз вне зависимости от условия. Чтобы лучше понять это посмотрите на следующий пример:
Пример 5. Различие между циклами while и do while
<html>
<body>
<h1>Цикл while:</h1>
<?
$a=20;
while ($a<10) {
echo ($a);
echo ("<br>");
$a++;
}
?>
<h1>Цикл do while:</h1>
<?
$a=20;
do {
echo ($a);
echo ("<br>");
$a++;
} while ($a<10);
?>
</body>
</html>
Как подействует PHP:
Выведет текст до <? без изменений
Присвоит значение переменной $a равное двадцати
Проверит, выполняется ли условие $a<10. Так как условие не выполняется, то PHP пропустит цикл
Выведет HTML-код, находящийся между ?> и <?
Присвоит значение переменной $a равное двадцати (хотя оно и было равно двадцати)
Войдёт в цикл do и выполнит тело цикла — выведет
$a, выведет тег <br> и увеличит $a на единицу
Проверит условие. Так как условие не выполняется, больше тело цикла не будет выполняться.
Выведет HTML-код, находящийся после ?>.
То есть, в цикле do whileодин раз тело цикла выполнится при любом условии. Результат работы примера 5 показан на рисунке 2:
Рисунок 2. Результат работы примера 5:
А вот полученый HTML-код:
<html>
<body>
<h1>Цикл while:</h1>
<h1>Цикл do while:</h1>
20<br></body>
</html>
Универсальный цикл
Возможно, Вам покажется, что заявлено слишком «громко», но, поверьте, так оно и есть. В PHP существует третий вид цикла — и это цикл for. Его по праву можно считать универсальным. Его внешний вид примерно таков:
Пример 6. Внешний вид цикла for:
for (инициализация; условие; изменение) {
// здесь находится тело цикла
}
Попробуем разобраться с тем, как действует цикл на примере:
Пример 7. Пример использования цикла for:
for ($a=1; $a<10; $a++) {
echo ($a);
echo ("<br>");
}
Если Вы наблюдательны, то Вы наверняка заметили, что этот пример в чём-то схож с примерами 2 и 4. Более того, скажу Вам, что все три примера (второй, четвёртый и седьмой) действуют абсолютно одинаково!
Однако, давайте же разберёмся с этим циклом. Как будет действовать PHP при обработке такого цикла?
Как только PHP увидит начало цикла for он первым делом выполняет действия, обозначенные как «инициализация» (в нашем случае —
переменной $a присвоит значение единицы)
Вторым шагом будет проверка условия: если оно не выполняется, то PHP выходит из цикла.
Если условие выполнилось, то выполняется тело цикла (в нашем случае выводится значение переменной $a и тег <br>
После того, как тело цикла выполнено, PHP выполняет действия «изменение» (см. внешний вид цикла for), в нашем случае — увеличение переменной $a на единицу ($a++)
Перейдёт
ко второму шагу, то есть к проверке условия и так до тех пор, пока условие не будет нарушено.
Я уверен, сейчас кто-нибудь про себя подумает: «И что же такого универсального в этом цикле?». А универсальность его ещё и в том, В качестве инициализации, условия и изменения мы можем указывать сразу несколько команд через запятую. Ну, например:
Пример 8. Универсальность цикла for:
<?php for ($i=1, $k=9; $i<10, $k>0; $i++, $k--) {
$s=$i+$k;
// находим сумму текущих элементов цикла — $i и $k
echo ($s);
// и выводим её
echo ("<br>");
// выводим тег <br>, чтобы как-то
// отделить одну сумму от другой
} ?>
В результате цикла девять раз нам будет выведено число десять.
Неожиданная остановка
Представьте такую задачу: в процессе выполнения цикла нам вдруг понадобилось из него выйти без завершения. Что делать? Благо, на этот случай разработчики PHP придумали команду break. Встретив эту команду интерпретатор тут же завершает работу с циклом и переходит на следующую после цикла команду.
Выглядеть это может примерно так:
Пример 9. Остановка цикла во время выполнения
for ($i=-5; $i<=5; $i++) {
if ($i==0) break;
// если $i равно нулю, то необходимо выйти из цикла
echo ($i);
// выводим значение $i
echo (" ");
// выводим пробел (для отделения одного числа от другого)
}
echo ("Ошибка! Переменная i не может быть равно нулю!");
В результате, как только цикл дойдёт до значения переменной $a=0, он прекратит выполнение цикла и выведет текст «Ошибка!»
Пропуск хода
А теперь немного изменим ситуацию: представьте, что нам нужно не полностью завершить цикл, а только пропустить текущий «круг» (ещё говорят «итерацию»). Что делать тогда? Тогда нужно воспользоваться
командой continue. Её действие заключается в том, что вместо того, чтобы выполнять тело цикла, она переходит к действию «изменение» (см. внешний вид цикла for), проверяет условие и начинает новый круг (если, конечно, условие выполняется). Немного изменив предыдующий пример мы можем получить такой код:
Пример 10. Пропуск текущей итерации цикла:
for ($i=-5; $i<=5; $i++) {
if ($i==0) continue;
// если $i равно нулю, то выводить его не надо —
// мы его просто пропустим
echo ($i);
// выводим значение $i
echo (" ");
// выводим пробел (для отделения одного числа от другого)
}
Помните, что команды break и continue можно использовать во всех видах циклов
Не забывайте также и то, что Вы спокойно можете писать один цикл внутри другого
Таблица умножения
Подумав, я решил, что такой пример будет наиболее понятен всем. Итак, задача: вывести таблицу умножения. Решение:
Думаю, я достаточно обильно прокомментировал этот код. Если у Вас возникнут проблемы с его пониманием — пишите мне. А вот и результат работы скрипта:
Рисунок 3. Полученная таблица умножения:
В качестве домашнего задания: постараться сделать таблицу
квадратов чисел от 3 до 47 (для этого можно ограничиться использованием только одного цикла). Полученный код присылайте для проверки ко мне в почтовый ящик.