http://sulfurzona.com/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Forum
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
Столбики сигнальные
Пластиковые дорожные столбики. Недорого! Большой выбор. Доставка
ros-znak.com
 

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, которые рассматривались ранее.
 
Продолжение следует…
 
© Владислав Демьянишин
 
Вы находитесь на официальном сайте Владислава Демьянишина - разработчика игры Dune IV (Dune 4). На нашем сайте Вы можете бесплатно скачать игры Dune IV (Dune 4), Battle City (Танчики с Dendy/Nintendo), читы к играм и многое другое. Также Вы можете скачать бесплатно программы и полезные утилиты. Все программы чистые, т.е. не содержат вирусов и иного вредоносного ПО.
 
Среди доступных программ есть мобильная читалка книг, менеджер переноса файлов с фото- и видеокамер на компьютер, текстовый редактор, WYSIWYG редактор, 3D аниматор, GIF аниматор, AVI аниматор, пакетный конвертор изображений, редактор электрических схем, программа для скриншотов, диспетчер тем рабочего стола и другие.
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ. Предлагаю также посетить Марья искусница - сайт о рукоделии (http://mariya-iskusnica.ru).
 
 

Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков (часть 4): Цикл while
 
 
 
1723
 
ВКонтакте
Facebook
 
 
 
На главную страницу На предыдущую страницу На начало страницы
 
 
Украинский портАл Украина онлайн Рейтинг@Mail.ru Рейтинг Сайтов YandeG Rambler's Top100