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

Программирование в Web

  Все выпуски  

Программирование в Web Выпуск 8 от 04/05/2006 Основы PHP - Урок-6


 
Программирование в Web

ОСНОВЫ PHP
 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в Web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
У Р О К — 6
Здравствуйте уважаемые подписчики!

Продолжаем изучение различных управляющих конструкций языка PHP. В этом уроке познакомимся с циклами. Это такие конструкции, которые позволяют удобно и коротко писать код, который будет выполнять какие-либо действия многократно.


УПРАВЛЯЮЩИЕ КОНСТРУКЦИИ:
ЧАСТЬ-2 — ЦИКЛЫ:

Часто, при написании сценариев на PHP вам может понадобиться выполнять ряд действий несколько раз подряд. Для этого удобно использовать различные циклы. В PHP существует четыре разновидности (с подвидами) циклов.

Цикл while:

Общий синтаксис:
<?php
while (условие) {
Тело цикла
}
?>

Эта конструкция чем-то напоминает конструкцию if. Условием может быть любое выражение, истинность которого проверяется. Данный цикл будет выполняться, пока условие истинно. Как только условное выражение вернет ложь (false), цикл прекратит свое выполнение. В теле цикла допустимо использовать любые команды и в любом количестве (ровно столько, сколько вам понадобится), каждая команда в теле цикла, так же как и вне цикла должна заканчиваться точкой с запятой, после while и условия точка с запятой не нужна (также как и в конструкциях if). Как выполняется этот цикл? Сначала, проверяется условие и если оно истинно, то выполняются команды из тела цикла, если же условие изначально ложно, то цикл не выполнится никогда.

Есть возможность создать бесконечный цикл с помощью этой конструкции, сделать это можно, например, так:

<?php
$i=0;
while (1) {
print "Это $i - я итерация цикла.<br>";
$i++;
}
?>

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

Цикл do... while:

Общий синтаксис:
<?php
do {
Тело цикла
}
while (условие);
?>

Здесь в теле цикла команды также заканчиваются точкой с запятой, ею же заканчивается и команда while (условие), а вот после do точка с запятой не ставится ни в коем случае. Что делает этот цикл? Фактически все то же, что и первый цикл, но при этом условие проверяется не в начале, а в конце каждой итерации, то есть, тело цикла при любом раскладе выполнится хотя бы один раз. В нем ведь условие проверяется уже после выполнения первого прохода. Этот цикл применяется гораздо реже, но все же может пригодиться.

Пример:

<?php
$i=0;
do {
print "Это $i - я итерация цикла.<br>";
$i++;
}
while ($i<100);
?>

Здесь в результате будет выведено 100 строк с номером итерации (от 0 до 99).

Примечание: Вы наверное обратили внимание на то, что открывающую фигурную скобку я ставил на одной строке с первым словом цикла (while и do)? Так вот, этого делать не обязательно, открывающую фигурную скобку можно поставить и на следующей строке, лишь бы она открывала тело цикла. Между открывающей фигурной скобкой и условием цикла (если цикл while) или между открывающей фигурной скобкой и вводным словом do (если это такой цикл) не стояло больше ничего лишнего. Это верно также и к конструкциям ветвления и к любым другим циклам и к функциям.

Цикл for:

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

Общий синтаксис:
<?php
for (инициализация счетчика; тестовое выражение; изменение счетчика) {
Тело цикла
}
?>

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

Вот простейший пример применения этого цикла:

<?php
for ($i=0; $i<100; $i++) {
print "Это $i - я итерация цикла.<br>"; }
?>

Результат работы этого цикла будет в точности такой же, как и результат предыдущего цикла. Зато выглядит эта запись явно изящнее и понятнее. В качестве условия или тестового выражения не обязательно использовать сам счетчик, можно организовать и логическую проверку на истинность или ложность:

<?php
for ($i=0; $i!=100; $i++) {
print "Это $i-я итерация цикла.<br>"; }
?>

В результате работы этого цикла (а изменилось лишь тестовое выражение) будет выведено бесконечное количество пронумерованных строк, кроме одной, с номером 100. Конечно, можно сделать проверку так, что будет проэмулирован предыдущий цикл. Для этого вам надо будет лишь в тестовом выражении скомбинировать различные логические условия (это тоже допустимо).

Цикл foreach:

И последний цикл, который рассмотрим подробнее чуток позднее, имеет два варианта и оба они предназначены для работы с массивами, а именно для перебора всех элементов массивов (и только для этого). Один вариант работает с массивами списками, а второй с ассоциированными массивами.

Общий синтаксис:
<?php
foreach ($array as $ar) {
Тело цикла
}
?>
Примечание: В теле цикла работа производится не с исходным массивом $array, a c его копией $ar, это надо помнить.

Пример:
<?php
$array=array(1,2,3,4,5,6,7,8,9);
foreach ($array as $arr) {
print "$arr<br>";
}
?>

Результатом работы этого цикла будет несколько строк с элементами массива на каждой по одному. В данном конкретном случае будет выведено следующее:

1
2
3
4
5
6
7
8
9

То есть все содержимое массива-списка.


МАССИВЫ:

Чтобы чуть лучше проиллюстрировать работу циклов foreach, немного отклонимся от циклов и поподробнее рассмотрим один из наиболее мощных типов данных. Рассмотрим массивы. Вообще, в обычном программировании, да и в объектно-ориентированном тоже, массивы применяются едва ли не чаще всех остальных типов данных вместе взятых. Их удобно использовать при работе с различными базами данных, с конфигурациями и вообще для чего-угодно.

В начале замечу, что массивы бывают двух типов, массивы-списки, индекса элементов которых представлены числами, и ассоциированные массивы, в которых в качестве индекса может быть любая строка, даже включающая пробелы, индексы ассоциированных массивов называют ключами. Немного вернусь к прошлым урокам, там я не объяснил подробно что такое массивы, но видно настало время.

Итак, массив, это целая структура, которая содержит в себе не одно значение, а несколько (сколько угодно много), представьте себе таблицу из нескольких столбцов и одной строки (одномерный массив), и в ней, в каждом столбце будет храниться определенное значение, то есть, например, массив $array можно представить в виде такой таблицы:

01234
applegrapestrawberrycronberrykiwi

то есть в столбце с номером 0 хранится значение «apple», в столбце с номером 1 значение «grape» и так далее (индексы массивов-списков нумеруются начиная с нуля, а не с единицы, то есть под индексом 1 будет хранится второе значение, а не первое). Естественно, что в качестве значения можно использовать не только цифры, но и строки и даже другие массивы (получится многомерный массив). Как же можно обращаться к отдельным элементам массива? Очень просто, достаточно после имени переменной массива в квадратных скобочках указать индекс (или ключ, если массив ассоциативный), со значением которого мы хотели бы поработать, например, print $array[3]; - распечатает четвертое значение массива, то есть значение, хранящееся под индексом 3.

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

<?php
$array=array(1, 2, 3, 4, 5); //Пока в массиве всего пять элементов
$y=6;
$array[]=$y; //Добавляем еще один (шестой) элемент
foreach ($array as $ar) {print "$ar<br>";}
?>
Результат:
1
2
3
4
5
6

То есть вы видите, что в массиве появился новый элемент (естественно у него номер будет 5) со значением 6. Ну а теперь снова к циклу foreach. Представим, что у нас есть массив, который содержит всего два значения, естественно мы легко сможем обращаться к любому из них безо всяких циклов, то есть напрямую по индексам. Ну а если наш массив содержит в себе сотню элементов? Или если мы вообще не знаем, сколько в массиве элементов? Вот для этого цикл foreach и нужен. Этот цикл автоматически определит количество элементов и предоставит возможность для работы с каждым элементом, не повреждая при этом исходный массив. Очень удобно. Но еще удобнее использовать второй вариант этого цикла, который предназначен для работы с ассоциированными массивами:

<?php
$array=array(1, 2, 3, 4, 5);
foreach ($array as &key=>$var)
{print "По индексу $key содержится $var<br>";}
?>
Результат:
По индексу 0 содержится 1
По индексу 1 содержится 2
По индексу 2 содержится 3
По индексу 3 содержится 4
По индексу 4 содержится 5

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

<?php
$array=array("first"=>"единица", "second"=>"двойка", "third"=>"тройка");
print $array['first'];
?>

Распечатает слово "единица", то есть значение ключа "first".

Соответственно добавлять еще один элемент в такой массив можно так:

<?php
$array=array("first"=>"единица", "second"=>"двойка", "third"=>"тройка");
$array['fruit']="apple";
print $array['fruit'];
?>

В результате работы этого скрипта будет выведено в браузер значение нового ключа, а именно «apple».

Более подробно массивы будут еще рассматриваться дальше, например, как упаковывать в строку содержимое массива и как распаковывать, как удалять отдельные значения и так далее, но это чуть позже, пока же вернемся к циклу. В обоих вариантах цикл foreachпросматривает каждый элемент массива, и на каждой итерации дает возможность обратится к очередному элементу в теле цикла.

Конечно можно просматривать массивы и в простых циклах (while, do... while, for), но foreach более удобен, нагляден, и главное быстрее, ведь он специально предназначен для перебора массивов.


СНОВА ЦИКЛЫ:

Все циклы, кроме foreach допускают любую степень вложенности циклов одного или разных типов. Цикл foreach, вложенность не допускает, точнее ошибки явной не будет, но работать такая конструкция будет непредсказуемо, так что не используйте вложенность циклов foreach.

Есть возможность выйти из цикла досрочно. Такое поведение циклов может понадобиться, если в теле цикла проверяется какое-то дополнительное условие, например:

<?php
$del=200;
for ($i=-10; $i<=1; $i++) {
if ($i==0) break;
print $del/$i;
print "<br>"; }
?>

Здесь, в случае, когда счетчик станет равным нулю, просто произойдет выход из цикла и цикл остановится, то есть деления на единицу уже не произойдет. Если это не то, что вам нужно, вы можете использовать вместо break команду continue, например:

<?php
$del=200;
for ($i=-10; $i<=1; $i++) {
if ($i==0) continue;
print $del/$i;
print "<br>";
}
?>

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

На этом данный урок «УПРАВЛЯЮЩИЕ КОНСТРУКЦИИ» можно закончить. В дальнейшем всегда буду стараться приводить примеры использования и таким образом проработаем нюансы.

PS. Еще хочу обратить ваше внимание, на то, что все эти уроки я даю по PHP версии 4 и выше. То есть, многое из того, что рассказываю или буду рассказывать, на версиях до четвертой (невключительно), просто не будет работать или будет работать некорректно. Но также, многое, из того, что здесь рассказываю будет работать под управлением PHP и версии 5. От версии к версии есть много отличий. Версия 5 наиболее продвинутая, она практически почти полностью объектно-ориентированная. Версия 4 тоже содержит в себе элементы объектно-ориентированного программирования, но в сильно усеченном виде, так, нет возможности работать с исключениями и нет возможности разбивать свойства по категориям. В целом же, большинство программ, написанных под четвертую версию, будут легко продолжать работать и под пятой версией, но не наоборот. Написанные под пятую версию сценарии могут не пожелать работать в четвертой. Но о таких нюансах я буду говорить, то есть то, что будет касаться конкретной версии ин терпретатора. Вот например, цикл foreach появился только в четвертой версии, в третьей для перебора значений массивов использовалась смешанная конструкция с использованием функции each(). Но я не буду на этом останавливаться, потому, что третью версию PHP сейчас уже трудно встретить на хостинговых серверах, сейчас используют либо 4.3.3, либо 5.0.1, или выше. Так что вот такие вот дела. Если что-то непонятно, - спрашивайте, насколько смогу - объясню.

 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в Web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
Автор рассылки — Anatolick
Сайт проекта — «Russian discussions Zone» — http://rdzone.org.ru
Движок для сайтов — «Tanat-Engine» — http://tanat.al.ru
Дискуссионный лист — «Все для Всех о РС»
 

В избранное