Отправляет email-рассылки с помощью сервиса Sendsay

PHP за чашкой кофе

  Все выпуски  

PHP за чашкой кофе Чашечка пятая — повторение - мать учения, повторение - мать


Информационный Канал Subscribe.Ru

PHP за чашкой кофе

Чашечка пятая — повторение - мать учения, повторение - мать

PHP за чашкой кофе

Здравия желаю!

Пользователям The Bat!: для нормального просмотра откройте файл message.html (он находится на специальной панели слева) т.к. сам bat неправильно отображает некоторые элементы рассылки

Для начала поясню одну конструкцию, которая вызвала затруднение у достаточно большого числа подписчиков. В прошлом выпуске, в примере №9 была указана такая строка:

<form action="?form=1">
Вообще, как правило, в свойстве action тега <form> указывается скрипт, который будет обрабатывать запрос. Но, т.к. в нашем случае форму выводит и обрабатывает один и тот же скрипт, то имя файла я писать не стал, а написал, что у скрипта должен быть параметр form=1. Это всё равно, что мы бы написали:

<form action="ЭТОТ_PHP_ФАЙЛ">
 <input type="hidden" name="form" value="1">
 ...
</form>
Что в первом, что во втором случае скрипту уже будет известна переменная с именем $form, значение которой будет равно 1.

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

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

Таким циклом в PHP является цикл while. Внешний вид цикла:

Пример 1. Внешний вид цикла while:
while (условие) {

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

То есть, пока условие выполняется PHP будет выполнять и тело цикла. Вот, например:

Пример 2. Пример цикла while:
$a=1;

while (
$a<10) {
echo (
$a);
echo (
"<br>");
$a++;
}

Посмотрим, как будет действовать PHP:

  1. Присвоит переменной $a значение единица
  2. Проверит условие $a<10?
  3. Т.к. $a всё ещё меньше 10, PHP выполнит команды тела цикла: выведет $a, выведет тег <br> (чтобы цифры были отделены друг от друга) и увеличит $a на единицу.
  4. Перейдёт на второй шаг и снова проверит условие. Так он будет действовать пока условие будет выполняться.
  5. Как только условие нарушилось, то есть $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:

  1. Выведет текст до <? без изменений
  2. Присвоит значение переменной $a равное двадцати
  3. Проверит, выполняется ли условие $a<10. Так как условие не выполняется, то PHP пропустит цикл
  4. Выведет HTML-код, находящийся между ?> и <?
  5. Присвоит значение переменной $a равное двадцати (хотя оно и было равно двадцати)
  6. Войдёт в цикл do и выполнит тело цикла — выведет $a, выведет тег <br> и увеличит $a на единицу
  7. Проверит условие. Так как условие не выполняется, больше тело цикла не будет выполняться.
  8. Выведет 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 при обработке такого цикла?

  1. Как только PHP увидит начало цикла for он первым делом выполняет действия, обозначенные как «инициализация» (в нашем случае — переменной $a присвоит значение единицы)
  2. Вторым шагом будет проверка условия: если оно не выполняется, то PHP выходит из цикла.
  3. Если условие выполнилось, то выполняется тело цикла (в нашем случае выводится значение переменной $a и тег <br>
  4. После того, как тело цикла выполнено, PHP выполняет действия «изменение» (см. внешний вид цикла for), в нашем случае — увеличение переменной $a на единицу ($a++)
  5. Перейдёт ко второму шагу, то есть к проверке условия и так до тех пор, пока условие не будет нарушено.

Я уверен, сейчас кто-нибудь про себя подумает: «И что же такого универсального в этом цикле?». А универсальность его ещё и в том, В качестве инициализации, условия и изменения мы можем указывать сразу несколько команд через запятую. Ну, например:

Пример 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 можно использовать во всех видах циклов
Не забывайте также и то, что Вы спокойно можете писать один цикл внутри другого

Таблица умножения

Подумав, я решил, что такой пример будет наиболее понятен всем. Итак, задача: вывести таблицу умножения. Решение:

Пример 11. Код получения таблицы умножения:
<html>

<title>Таблица умножения</title>
<body>
<table border=1>
<?

for ($i=1; $i<=10; $i++) {
// запускаем первый цикл

echo ("<tr>");
// начало строки таблицы

for ($k=1; $k<=10; $k++) {
// запускаем второй цикл

echo ("<td align=center>");
// открываем ячейку таблицы

$p=$i*$k;
// находим произведение двух чисел и...

echo ($p);
// выводим его,

echo ("</td>");
// а потом закрываем ячейку
}

echo (
"</tr>");
// конец строки таблицы
}

?>
</table>
</body>
</html>

Думаю, я достаточно обильно прокомментировал этот код. Если у Вас возникнут проблемы с его пониманием — пишите мне. А вот и результат работы скрипта:

Рисунок 3. Полученная таблица умножения:

В качестве домашнего задания: постараться сделать таблицу квадратов чисел от 3 до 47 (для этого можно ограничиться использованием только одного цикла). Полученный код присылайте для проверки ко мне в почтовый ящик.

До будущих встреч! Пока!


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: inet.webbuild.phplearn
Отписаться

В избранное