http://sulfurzona.ru/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Wing-Thunder Game (fly simulator)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
Скачать игру Крыло-Гром (Wing-Thunder) бесплатно
 
 

PHP и WEB для новичков (часть 4)

 
Автор: Владислав Демьянишин
 
PHP и WEB для новичковСегодня, продолжая тему программирования на языке PHP, рассмотрим организацию циклических алгоритмов.

Цикл while()


Ранее уже говорилось о том, что порядок выполнения операторов в скрипте - последовательный, начиная с первого и заканчивая последним. Однако в большинстве случаев возникает необходимость выполнять некоторую часть кода несколько раз, возможно, с изменяющимися параметрами.
Для таких целей применяют циклы while() и for(). Рассмотрим сначала цикл while() как наиболее простой. Схема выполнения цикла проста:

while(условие) оператор;

Такой оператор цикла называется циклом с предусловием. Оператор, идущий после служебного слова while, называется телом цикла и выполняется до тех пор, пока условие выполняется, т.е. имеет значение true.
Думаю, не нужно объяснять, что код в теле цикла должен обеспечивать условие завершения цикла для того, чтобы цикл не мог выполняться бесконечно. Поскольку если время выполнения скрипта превысит 30 секунд (стандартный лимит сервера Apache) сервер прервет выполнение скрипта. Например:

<?
    $i = 0;
    while($i < 10) $i++;
    echo $i;
?>

Этот цикл выполняется ровно 10 раз. Каждое выполнение тела цикла называется шагом цикла или итерацией. В данном примере при каждой итерации содержимое переменной $i будет увеличиваться на единицу, и как только ее значение перестанет быть меньше 10, условие $i < 10 будет иметь значение false.
Произойдет выход из цикла и выполнение перейдет к оператору, следующему за оператором цикла, т.е. будет выполнен оператор echo $i; Давайте добавим в тело цикла оператор вывода результата, чтобы посмотреть детальнее выполнение цикла:

<?
    $i = 0;
    while($i < 10){
            $i++;
            echo "i = $i<br />n";
           }
?>

Теперь значение переменной $i будет выводиться при выполнении каждой итерации, и станет видно, как значение переменной меняется с 1 до 10.
При составлении условия цикла можно применить все те приемы с логическими операциями, которые были рассмотрены выше.
Цикл while имеет две формы. Описанная выше есть наиболее распространенной и применяется практически везде.

Однако у нее есть особенность - условие прекращения выполнения цикла должно быть записано сразу после служебного слова while, т.е. условие должно быть известно до начала выполнения тела цикла, и если это условие не истинно, то цикл не выполняется ни разу.

Другая форма выглядит так:

do оператор while(условие);

Такой оператор называется оператором цикла с постусловием. Этот цикл проверяет истинность условия не до, а после выполнения тела цикла. Т.е тело цикла выполняется всегда один раз, даже, если условие не справедливо. Пример обоих форм цикла:

<?
    $i = 20;
    while($i < 10){
            $i++;
            echo "i = $i<br />n";
           }
 
    $i = 20;
    do{
         $i++;
         echo "i = $i<br />n";
        } while($i < 10);
?>

Первый цикл ни разу не выполняется, поскольку перед его выполнением будет осуществлен анализ условия, где будет проверено значение переменной $i. А раз оно не меньше 10, то цикл не будет выполняться вообще.
В то время, как другой цикл выполнится один раз, после чего будет проверено условие и, поскольку условие будет также равно false, произойдет выход из цикла.

Операторы break и continue


Другими полезными средствами работы с циклами есть операторы break и continue. Первый из них позволяет досрочно прервать работу цикла в любой его части, не выполняя операторы, следующие за оператором break.
Работа continue прямо противоположна - он позволяет продолжить выполнение цикла. Т.е. break передает управление оператору, следующему после цикла, а continue передает управление оператору, который идет первым в теле цикла (разумеется, при этом выполняется проверка условия цикла). Пример использования break:

<?
    $str = "Что такое хорошо и что такое плохо?";
    $word = "хорошо";
    $index = 0;

    while($index < strlen($str) - 5){
             if(substr($str, $index, 6) == $word) break;
             $index++;
           }
    if($index == strlen($str) - 5) echo "Слово '$word' не найдено в строке '$str'";
      else echo "Слово '$word' в строке '$str' расположено в позиции $index";
?>

Проведем разбор кода и одновременно рассмотрим пару новых функций для работы со строками текста. Этот пример ищет первое вхождение слова $word в строке $str. Конечно, для этой цели логичнее было бы применить стандартную функцию strpos(), но цель данного примера проиллюстрировать работу оператора break.

В переменной $index хранится номер позиции в строке $str, в которой проверяется наличие искомого слова, и при помощи цикла последовательно наращиваем $index от 0 (начало строки, индекс первого ее символа) до конца строки.
На самом деле нет смысла просматривать всю строку, а достаточно просканировать лишь столько символов, сколько в строке минус длина искомого слова, уменьшенная на единицу (выражение strlen($str) - 5). Назовем эту часть строки эффективной длиной строки.

Чтобы было более понятно, приведу такой пример: если мы ищем слово из пяти букв в строке из десяти букв, то после 6-й буквы искать уже просто нет смысла, поскольку остаток строки будет иметь длину меньше чем у искомого слова.
Количество символов в строке $str возвращает функция strlen($str). Аналогично нет необходимости просматривать всю строку, если мы уже нашли искомое слово где-то в середине строки. Поэтому, когда слово найдено в позиции $index, выполнение цикла прерывается оператором break.

Функция substr($str, $index, 6) возвращает фрагмент строки $str, находящийся, начиная с позиции $index и длиной 6 символов. Если окажется, что найденный фрагмент является искомым словом $word, то условие if() будет справедливо и цикл прервется оператором break.
После прекращения цикла проверяется, как же цикл завершился. Ведь цикл может завершиться в двух случаях. Первый - когда вся строка исчерпана, но слово не найдено, второй случай - когда слово найдено.
Первый случай распознается, если условие $index == strlen($str) - 5 выполняется, т.е. эффективная длина строки исследована (исчерпана). Второй случай, когда $index меньше эффективной длины строки.
Теперь разберем пример с continue.

<?
    $numbers = array();
    while(count($numbers) < 10){
            $random = rand(1, 100);

            if( $random % 3 ) continue;
            if( in_array($random, $numbers) ) continue;
            echo "$random<br />n";

            $numbers[] = $random;
           }
?>

Этот цикл выдает 10 случайных чисел от 1 до 100, при этом проверяется условие: делится ли это число на 3 и не повторяется ли в массиве какое-то из них.
В начале выполнения скрипта создается пустой массив $numbers = array(). Далее идет цикл, условие прекращения которого есть заполнение массива 10-ю элементами (длину массива возвращает функция count).
В каждой итерации генерируется случайное число $random. Для генерации случайных чисел применяем функцию rand(), которая возвращает число в диапазоне между двумя указанными аргументами. После чего оно проверяется (в строке if( $random % 3 )) на деление на 3, и если делится, то остаток от деления будет равен 0.

Если остаток не равен нулю, то произойдет выполнение оператора continue, ведь дальнейшее выполнение данной итерации бессмысленно и управление перейдет на начало цикла и начнется новая итерация. Если же остаток равен нулю, то число проверяется на наличие в массиве функцией in_array($random, $numbers).

И если оно уже там содержится, то текущую итерацию продолжать не имеет смысла и выполнится оператор continue. Если такого числа в массиве нет, то это то, что нам надо, а на будущее заносим его в массив комбинацией $numbers[] = $random. Это гарантирует то, что среди 10 сгенерированных чисел ни одно не повторится.

Циклы for(), foreach()


Применение цикла часто имеет схожие черты:
а) перед началом цикла устанавливается некоторое условие;
б) на каждом шаге цикла это условие проверяется;
в) в результате выполнения тела цикла изменяются некоторые параметры, которые влияют на проверяемое условие.

Упрощением данной схемы есть цикл for(). Схема его выполнения такова:

for(оператор1; условие; оператор2) оператор3;

Такой оператор называется оператором цикла с параметром. Перед началом цикла выполняется оператор1. Потом проверяется условие. Если условие справедливо, то выполняется тело цикла - оператор3, а после него - оператор2. Потом снова проверяется условие, и так далее, пока условие будет справедливо.
Очень распространено применение цикла for() для перебора чисел от одного значения до другого с определенным шагом:

<?
    for($i=0; $i<10; $i++) {
         echo "i=$i<br>n";
    }
?>

Этот пример выдаст последовательно числа от 0 до 9.

<?
    for($i=0; $i<10; $i=$i+2) echo "i=$i<br>n";
?>

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

i=0
i=2
i=4
i=6
i=8


Другим типичным применением является перебор элементов массива:

<?
    $fruits = array("яблоко", "груша", "банан", "апельсин");
    for($i=0; $i<count($fruits); $i++) echo "$fruits[$i]<br>n";
?>

Данный скрипт выдаст все элементы массива $fruits. Для перебора элементов массива существует более удобная конструкция foreach():

<?
    $fruits = array("яблоко", "груша", "банан", "апельсин");
    foreach($fruits as $f) echo "$f<br>n";
?>

Этот пример выполняет то же самое, что и предыдущий, но является более наглядным. foreach() позволяет перебирать не только элементы, но и индексы (ключи) массива:

<?
    $fruit_colors = array("яблоко" => "зеленый",
                                      "груша" => "желтый",
                                      "банан" => "желтый",
                                      "апельсин" => "оранжевый"
);
    foreach($fruit_colors as $fruit => $color) echo "цвет фрукта $fruit: $color<br>n";
?>

Данный скрипт перебирает все ключи ("яблоко", "груша", ...) и соответствующие им значения ("зеленый", "желтый", ...) массива $fruit_colors и выдаст:

цвет фрукта яблоко: зеленый
цвет фрукта груша: желтый
цвет фрукта банан: желтый
цвет фрукта апельсин: оранжевый


Теперь рассмотрим более сложный пример применения цикла for() с вложенными циклами, т.е. с циклом в цикле. Данный пример просто выдаст таблицу умножения. Кроме кода PHP тут показано как практически применить его для генерации web-странички.

<html>
<head><title>таблица умножения</title></head>
<body>
<table border="1">
<?
    for($y=1; $y<=10; $y++){
         echo "<tr>n";

         for($x=1; $x<=10; $x++){
               echo "    <td>";
               echo $x * $y;
               echo "</td>n";
              }
         echo "</tr>n";
       }
?>
</table>
</body>
</html>

Вот какой вид будет это иметь, если запустить скрипт (рис. 4).
 
PHP и WEB для новичков (часть 4): Цикл while
Рис. 4

В данном случае имеем два цикла for() - один внутри другого. Внешний цикл (с переменной-счетчиком $y) отвечает за вывод строк таблицы. Поскольку начальным оператором есть $y=1, а условием - $y<=10, то выдаст он ровно 10 строк, в первой $y будет равна 1, во второй - 2, и т.д., до десяти.

В теле цикла выводится тег начала строки таблицы <TR>, после чего запускается внутренний цикл (с переменной-счетчиком $x). Этот цикл аналогично проходит 10 раз от 1 до 10 и выдает как раз числа таблицы умножения ($x * $y). После завершения цикла по $x выдается тег конца строки таблицы </TR>.

Прошу обратить внимание на символы n в конце строк и пробелы перед тегом <TD>. Разумеется, что скрипт будет работать успешно и без них, и страничка будет выглядеть также, но при этом исходный текст странички будет иметь трудночитаемый вид, что весьма усложнит поиск ошибок на странице.

Поэтому я рекомендую исходный текст страницы формировать читабельным еще на этапе написания PHP-кода. Это позволит сэкономить много времени при отладке работы скрипта.
К тому же в циклах for() и foreach() можно применять операторы break и continue, которые рассматривались ранее.
 
Продолжение следует…
 
© Владислав Демьянишин
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
 

Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков (часть 4): Цикл while
 
 
 
 
 
 
На главную страницу На предыдущую страницу На начало страницы