Сегодня: Четверг
5-е Марта
2026-го года.
Сейчас: 20:24
 

N1

N1  
 
Тут находиться копия текста из книги Джанет`a Валейд`a. с использованием на практике сценариев.

Глава 4 Глава 5 Глава 6 Глава 7 Глава 8 Глава 9

Глава 7

Управление ходом выполнения сценария

В этой главе...

Изменение порядка выполнения операторов в сценарии
Проверка условий
Создание сложных условий путем объединения простых
Использование условий в условных выражениях и циклах
Использование конструкции if
Создание и использование циклов
Прерывание циклов

 

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

Изменение порядка выполнения операторов в сценарии

Простые операторы РНР выполняются по очереди, один за другим, с начала и до конца. Рассмотрим следующий фрагмент кода:
$а = "Доброе утро";
echo $а;
$а = "Добрый день";
echo $a;

Для того чтобы изменить порядок выполнения операторов, необходимо изменить порядок их следования в файле, например:
$а = "Добрый день";
echo $a;
$а = "Доброе утро";
echo $a;

Предположим, что нужно вывести приветственное сообщение в зависимости от времени суток, т.е. до полудня необходимо отображать Доброе утро, а после полудня — Добрый день. Другими словами, нужно сделать следующее:
if (время до полудня)
{
$а = Доброе утро;
echo $a;
}
or else if (время после полудня)
{
$a = Добрый день;
echo $a
}

Таким образом, для вывода соответствующего приветственного сообщения следует воспользоваться сложным оператором, в котором проверяется время суток. Язык РНР предоставляет два возможных способа, которые позволяют выполнять такие сложные действия.

    Условные операторы. В некоторых случаях необходимо выполнять операторы или какие-либо действия только при выполнении определенных уеловий. Например, каталог с продукцией необходимо показывать только покупателям, которые оплатили свои счета, и не делать этого для тех, кто имеет задолженность. Такие операторы называются условными (conditional statement). В PHP существуют условные операторы if и switch.
Циклы. Часто требуется выполнить некоторый блок кода несколько раз подряд. Например, нужно передать сообщения по электронной почте всем покупателям. Чтобы осуществить это, необходимо выполнить две операции: первая из них будет извлекать информацию об электронных адресах покупателей из базы данных, а вторая — отправлять соответствующие сообщения. Причем эти действия нужно осуществить для всех покупателей из базы данных. Операция, которая позволяет выполнять операторы несколько раз подряд, называется циклом (loop). В РНР циклы реализуются с помощью операторов for, while и do. . while.

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

Проверка условий

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

    Равны ли два значения? Имеет ли Бобби ту же фамилию, что и Салли? Достиг ли Ник 15-летнего возраста?
Больше или меньше одно значение другого? Младше ли Ник, чем Бобби? Стоит ли дом Салли больше одного миллиона долларов?
    Соответствует ли строка шаблону? Начинается ли имя Бобби с буквы С? Состоит ли почтовый индекс из пяти цифр?

Можно проверять условия, состоящие из нескольких вопросов. Рассмотрим такие примеры. Верно ли, что Ник старше Бобби и младше Салли? Верно ли, что сегодня воскресенье и солнечный день? Верно ли, что сегодня воскресенье или понедельник?

Использование операций сравнения

В РНР имеется набор операций, предназначенных для сравнения значений (табл. 7.1).
Таблица 7.1. Операции сравнения

Операция Описание
== Равнозначны ли значения двух переменных?
=== Одинаковы ли как значения, так и типы двух переменных?
> Больше ли первое значение, чем второе?
>= Верно ли, что первое значение не меньше второго?
< Меньше ли первое значение, чем второе?
<= Верно ли, что первое значение не больше второго?
! =, <> Не равны ли значения двух переменных?
! == Не одинаковы ли значения или типы данных двух переменных?

Сравнивать можно как числовые значения, так и строковые. Текстовые строки ранжируются в алфавитном порядке, причем строки, которые начинаются с прописных букв, предшествуют строкам, начинающимся со строчных, например SS идет перед Sa. Символы пунктуации также имеют свой порядок следования, и можно говорить о том, что один символ "больше" другого. Однако такое сравнение, например запятой и точки, не имеет большого практического значения.

Текстовые строки можно сравнивать на основе ASCII-кодов. Каждый символ имеет свой ASCII-код, который соответствует целому числу от 0 до 127. И соответственно сравнение текстовых строк осуществляется на основе этого кода. Например, код, соответствующий запятой, равен 44, а точке — 46. Таким образом, можно сказать, что точка "больше" запятой.

Рассмотрим несколько примеров правильных выражений проверки на истинность в РНР

    $а == $b
$age != 21
    $ageNick < $ageBobby
    $house_price >= 1000000
Операция сравнения, проверяющая равенство двух значений, состоит из двух символов равенства (==). Одной из наиболее частых ошибок является использование для сравнения одного знака равенства (=). В этом случае происходит присваивание значения переменной. Так, в выражении if ($weather = "дождливая") значение переменной $weather станет равным "дождливая", сравнение производиться не будет, и результат этого оператора всегда будет истинным.

РНР проверяет условие и возвращает булево значение: TRUE (истина) или FALSE (ложь).Рассмотрим следующее выражение:
$а == $b

Если, например, $а = 1 и $b = 1, то это выражение будет истинным, а в случае $а = 1 и $b = 2 — ложным.

Для отрицания при сравнении используется операция восклицания (!). Рассмотрим следующий фрагмент кода:
$аge ! = 21

В этом выражении проверяется, не равно ли значение переменной $аде числу 21. Еcли, например, $аge = 20, это условие истинно

Проверка содержимого переменной

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

isset($имя_переменной) #Истина, если переменная
#объявлена даже без присваивания значения.
empty($имя_переменной) #Истина, если значение переменной
#равно нулю или пустой строке,
#либо переменная не объявлена.

РНР также позволяет проверить тип переменной. Например, для того чтобы проверить, является ли переменная целочисленной, следует воспользоваться функцией
is_int($number)

Результатом выполнения этой функции является TRUE, если переменная $number имеет тип integer. Рассмотрим подобные функции.

    is_array ($var2) проверяет, является ли переменная $var2 массивом.
is_float ($number) проверяет, является ли переменная $number числом с плавающей точкой.
    is_null ($varl) проверяет, равно ли значение переменной $varl нулю
    is_numeric($string) проверяет, является ли переменная $string числовой строкой.
    is_string ($string) проверяет, является ли переменная $string строкой.

Для проверки обратных условий следует воспользоваться символом восклицания (!). Например, при обработке следующего выражения будет получено значение TRUE, если переменная не объявлена:
!isset($имя_переменной)

Использование регулярных выражений

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

Возможно, вам уже приходилось использовать регулярные выражения. Например, при поиске файлов символ звездочки (*) часто используется для обозначения любого символа или нескольких символов (dir ex*.doc или ls ex*.txt). В этом случае ex*.txt является шаблоном, которому соответствуют такие строки, как exam.txt, ехЗЗ.txt и ехЗх4.txt. Проверка регулярных выражений, конечно же, посложнее, чем просто использование символа звездочки.

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

Использование в шаблоне специальных символов

Обычно шаблоны состоят из буквенных (литеральных) и специальных символов. Буквенные символы не имеют какого-то специального назначения. Например, символ е определяет букву е как одну из 26 букв алфавита. В то же время специальные символы имеют в шаблонах свое функциональное назначение. Например, символ звездочки заменяет любой другой символ или несколько вхождений этого символа. В табл. 7.2 приведен список и краткое описание специальных символов, использующихся в шаблонах.
Таблица 7.2. Специальные символы, используемые в шаблонах

Символ Назначение Пример Соответствует шаблону Не соответствует шаблону
^ Начало строки экзамен математический экзамен
$ Конец строки н$ экзамен экзамены
. Любой одиночный символ .. до, от
Более длинные слова также соответствуют этому шаблону, поскольку включают текстовую строку из двух символов
а, 2
? Предшествующий символ является
не обязательным
ger?m germ, gem geam
( ) Группирует буквенные символы в последовательность, которую в точности должна содержать строка g(er)m germ Gem, grem
[ ] Включает набор необязательных
символов
g[er]m gem, grm germ, gel
[^] Определяет все символы, кроме
указанных
g[^er]m gym, gum gem, grem, germ
- Включает диапазон всех символов, заключенных между двумя (ряд возможных символов) g[a-c]m gam, gbm, gem gdm, gxm, ga
+ Один или несколько наборов предшествующих символов bldg[l-3]+ bldg111, bldg132 bldg, bldg555
* Один, ни одного или несколько вхождений предшествующего символа ge*m gm, geeem germ, grm
{n} Повторение n раз ge{5}m geeeeem geeeem,
geeeeeem
{n1, n2} Определяет диапазон повторений символа (символов) а{2,5} aa, aaa, aaaa, 145aaaaa 1, a3
\ Определяет буквенный символ g\*m g*m gem, germ
(||) Набор альтернативных строк (Сэм|Салли) Салли Сара,Салмон

Некоторые примеры шаблонов

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

<? $a = "экзамен";
$b = ereg( "^э",$a );
echo $b; ?>

Пример 1
^[А-Яа-я].*

Этот шаблон определяет строки, начинающиеся с букв, и состоит из двух частей

    ^ [А-Яа-я]. Первая часть определяет, что строки должны начинаться с букв (как верхнего, так нижнего регистра).
.*. Вторая часть указывает на то, что строка должна состоять из одного или нескольких символов.

Этому шаблону удовлетворяют следующие текстовые строки: играй в футбол, Сэм и Я.

Такие строки, как 123 и ?, ему не соответствуют.

Пример 2
Уважаемый (Ким|Рикки)

Этот шаблон определяет две различные строки и состоит из двух частей.

    Уважаемый. Первая часть соответствует простому набору букв
(Ким | Рикки). Вторая часть соответствует либо значению Ким, либо Рикки.

Шаблону Уважаемый (Ким| Рикки) соответствуют текстовые строки Уважаемый Ким и Уважаемый Рикки.

Такие выражения, как Уважаемый Боб и Ким, не удовлетворяют этому шаблону.

Пример 3
^[0-9]{5}(\-[0-9]{4})?$

Этот шаблон определяет общий формат почтового индекса и состоит из нескольких частей

    ^[ 0 - 9 ] {5}. Первая часть определяет строку, состоящую из пяти цифр.
\-. Символ обратной косой черты (\) указывает на то, что дефис (-) в данном случае используется в качестве буквенного, а не специального символа.
    [ 0 - 9 ] {4}. Эта часть шаблона определяет строку, состоящую из четырех цифр.
    ( ) ?. Этот набор символов включает в себя последние две части шаблона и указывает на то, что они являются необязательными.
    $. Символ доллара ($) является символом конца строки (т.е. после шаблонг не должны стоять никакие другие символы).

Этому шаблону удовлетворяют текстовые строки 90001 и90002-4323.

Такие строки, как 9001 и 12-4321, ему не соответствуют.

Пример 4
^.+@.+\.com$

ЭТОТ шаблон определяет любую строку, содержащую символ @ и имеющую окончание .com. Другими словами, он задает адрес электронной почты. Этот шаблон состоит из следующих частей.

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

Такому шаблону удовлетворяют текстовые строки you@yourcompany.com и johndoe@somedomain.com.

Такие строки, как you@yourcompany.net, you@.com и @you.com, ему не соответствуют

Сравнение строк с шаблоном

Для сравнения строк с шаблоном можно воспользоваться функцией ereg(). Ее синтаксис имеет следующий вид:
ereg("шаблон", значение);

Например, для того чтобы проверить правильность имени, введенного пользователем в форме, необходимо сравнить переменную $name (в которой оно хранится) с шаблоном: ereg("^[А-Яа-я' -]+$", $name)

+

Данный шаблон интерпретируется следующим образом.

    Символы ^ и $ определяют начало и конец текстовой строки соответственно. Это означает, что строка должна полностью соответствовать созданному шаблону.
Все разрешенные буквенные символы строки заключаются в квадратные скобки. К ним относятся буквы верхнего и нижнего регистров, апостроф, пробел и дефис.
    В пределах квадратных скобок можно задавать область изменения символов (например, А-Я). При этом дефис интерпретируется не как буквенный, а как специальный символ. Для того чтобы изменить это правило, необходимо, чтобы дефис не был заключен между двумя символами, т.е. его следует разместить в конце, после набора букв.
    После квадратных скобок следует символ "плюс". Он указывает на то, что строка может содержать любое количество символов, заданных в квадратных скобках, но не меньше одного.

Объединение условий

Часто бывает необходимо проверить несколько условий одновременно. Предположим,например, что компания имеет каталог продуктов на различных языках. Необходимо определить, описаниями каких продуктов интересуется покупатель и на каком языке. Для этого следует объединить несколько условий. Общий синтаксис имеет следующий вид:
условие1 and|or|хоr условие2 and|or|хоr условиеЗ and|or|хоr ...

Условия можно объединять с помощью следующих трех выражений (логических операторов)

    and (логическое И). Результирующее условие истинно, если истинны оба условия
or (логическое ИЛИ). Результирующее условие истинно, если хотя бы одно из условий истинно.
  хоr (логическое исключающее ИЛИ). Результирующее условие истинно, если истинно одно из условий, но не оба одновременно.

В табл. 7.3 приведены примеры сложных условий, состоящих из более простых.
Таблица 7.3. Сложные условия

Условие Истина, если...
$ageBobby == 21 or $ageBobby == 22 Бобби 21 ИЛИ 22 года
$ageSally > 29 and $state == "OR" Салли больше 29 лет, и она живет штате Орегон
$ageSally > 29 or $state == "OR" Салли больше 29 лет или она живет штате Орегон
$city == "Рено" xor $state == "OR Значение переменной $city равно Рено или значение переменной $ state —OR, НО не одновременно
$name != "Сэм" and $age < 13 Любое ИМЯ, кроме Сэм, И возраст не старше 13 лет

Можно объединить любое количество условий. При этом порядок проверки условий следующий: наибольший приоритет имеют выражения, содержащие and, затем хоr и or. Рассмотрим следующее составное условие, состоящее из трех простых:
$resCity == "Рено" or $resState == "NV" and $name == "Салли"

Если имя покупателя Салли и она живет в штате Невада (NV), то результирующее выражение истинно. Тот же результат будет получен и в том случае, если покупатель живет в городе Рено, независимо от его имени. Это условие ложно, если покупатель обитает в Неваде, но его именем является не Салли. Все эти результаты получаются в результате следующего порядка проверки условий.

  1. Обрабатывается выражение, содержащее логическое И (and). Интерпретатор РНР проверяет, равны ли значения переменных $resState и $name соответственно NV и Салли. Если оба значения совпадают, то условие верно и нет необходимости проверять условие, содержащее or. В противном случае РНР переходит к обработке следующего (по приоритету) выражения.
  2. Обрабатывается выражение, содержащее логическое ИЛИ (or). Интерпретатор РHР проверяет значение переменной $resCity. Если оно равно Рено, то условие истинно, иначе — ложно.

Для того чтобы изменить порядок обработки логических операторов, следует воспользоваться скобками (()). Тогда условия, заключенные в скобки, будут иметь больший приоритет. Например, предыдущий пример можно переписать следующим образом:
($resCity == "Рено" or $resState == "NV") and $name == "Салли"

В этом случае скобки позволяют изменить порядок проверки условий, т.е. сначала будет обрабатываться выражение, содержащее логическое ИЛИ (or). Результирующее условие будет истинным в том случае, если имя покупателя Салли и она живет либо в городе Рено либо в штате Невада (NV). Этот результат получен благодаря следующему порядку проверки условий.

  1. Обрабатывается выражение, содержащее логическое ИЛИ (or). Интерпретатор РНР проверяет, равны ли значения переменных $resCity и $resState соответственно Рено и NV. Если обе эти переменные имеют другие значения, то результирующее условие ложно и проверка прекращается. В противном случае РНР переходит к обработке следующего (по приоритету) выражения.
  2. Обрабатывается выражение, содержащее логическое И (and). PHP проверяет значение переменной $name. И если оно равно Салли, то результирующее условие истинно, иначе — ложно.
Скобки стоит использовать даже в тех случаях, когда вы уверены в порядке обработки условий. Лишние скобки не помешают. В противном случае результат проверки условий может оказаться самым неожиданным.
Если вы знакомы с другими языками программирования, например С, то вам, наверное, приходилось использовать такие операторы, как | | (в качестве логического ИЛИ
or) и && (в качестве логического И and). Эти операторы можно применять и в языке РНР. Например, выражение $а < $b && $с > $b эквивалентно $а < $b and
$с > $b. При этом оператор | | проверяется перед or, а && — перед and

Использование условных операторов

Условный оператор (conditional statement) выполняет фрагмент кода только при соблюдении определенного условия. Рассмотрим два наиболее полезных вида условных операторов.

    Оператор if. Проверяет условие и, если оно истинно, выполняет соответствующий фрагмент кода.
Оператор switch. Проверяет набор альтернативных условий и, если одно из условий истинно, выполняет соответствующий фрагмент кода.

Использование оператора if

Оператор if предполагает проверку некоторого условия и, если оно истинно, выполнение соответствующего блока инструкций. Общий синтаксис оператора if имеет следующий вид:
if (условие)
{
Фрагмент кода
}
elseif (условие)
{
Фрагмент кода
}
else
{
Фрагмент кода
}

Оператор if состоит из следующих элементов.

    if. Обязательная часть, проверяющая условие.
  • Если условие истинно, выполняется первый фрагмент кода. После выполнения операторов этого блока интерпретатор РНР переходит к обработке следующего за if оператора. Если условный оператор содержит также блок elseif или else, они пропускаются.
  • Если условие ложно, первый фрагмент кода не выполняется и интерпретатор РНР переходит к обработке следующей за этим фрагментом инструкции, которой может оказаться блок elseif, else или любой другой оператор, следующий за if.
elseif. Необязательный раздел оператора if . При желании можно использовать несколько разделов elseif. В этих разделах тоже проверяется истинность некоторого условия.
  • Если условие истинно, выполняется соответствующий фрагмент кода. После выполнения всех операторов этого фрагмента РНР переходит к обработке следующего за if оператора. Если условный оператор содержит несколько блоков elseif и else, они игнорируются.
  • Если условие ложно, соответствующий фрагмент кода не выполняется и РНР переходит к обработке следующего блока оператора if (т.е. блока elseif или else), а при его отсутствии — к следующему за if оператору.
    else. Этот раздел тоже является необязательным. При этом в рамках одного оператора if блок else можно использовать только один раз. В блоке else условие не проверяется, а выполняется фрагмент кода, если все условия, содержащиеся в предыдущих блоках оператора if, ложны.

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

<? $score = 3;
if ($score > 92)
{
$grade = "А";
$message = "Отлично";
}
elseif ($score <= 92 and $score > 83)
{
$grade = "B";
$message = "Хорошо";
}
elseif ($score <= 83 and $score > 74)
{
$grade = "C";
$message = "Удовлетворительно";
}
elseif ($score <= 74 and $score > 62)
{
$grade = "D";
$message = "Неудовлетворительно";
}
else
{
$grade = "F";
$message = "Хуже некуда!";
}
echo "$message"."\n";
echo "Ваша оценка $grade\n";
?>
92) { $grade = "А"; $message = "Отлично"; } elseif ($score <= 92 and $score > 83) { $grade = "B"; $message = "Хорошо"; } elseif ($score <= 83 and $score > 74) { $grade = "C"; $message = "Удовлетворительно"; } elseif ($score <= 74 and $score > 62) { $grade = "D"; $message = "Неудовлетворительно"; } else { $grade = "F"; $message = "Хуже некуда!"; } echo "
","$message"."\n";
	echo "Ваша оценка $grade\n","
"; ?>

Оператор if обрабатывается следующим образом.

  1. Значение переменной $score сравнивается с 92. Если оно больше этого числа, переменной $grade присваивается А, а переменней $message — значение Отлично, и интерпретатор РНР переходит к строкам, в которых информация выводится с использованием функции echo. Если $score меньше или равно 92, переменные $grade и $message не инициализируются и интерпретатор РНР переходит к инструкции elseif.
  2. Значение переменной $score сравнивается с числами 92 и 83. Если оно меньше или равно 92 и больше 83, выполняется инициализация переменных $grade и $message, и интерпретатор РНР переходит к строкам, в которых информация выводится с использованием функции echo. Если $score меньше или равно 83, переменные $grade и $message не инициализируются и интерпретатор РНР переходит ко второй инструкции elseif.
  3. Значение переменной $score сравнивается с 83 и 74. Если оно меньше или равно 83 и больше 74, выполняется инициализация переменных $grade и $message и интерпретатор РНР переходит к строкам, в которых информация выводится с использованием функции echo. Если $score меньше или равно 74,переменные $grade и $message не инициализируются и интерпретатор РНР переходит к следующей инструкции elseif.
  4. Значение переменной $score сравнивается с 74 и 62. Если оно меньше или равно 74 и больше 62, осуществляется инициализация переменных $grade и $message и интерпретатор РНР переходит к выводу данных с использованием функции echo. Если $score меньше или равно 62, переменные $grade и $message не инициализируются и интерпретатор РНР переходит к инструкции else.
  5. Переменной $grade присваивается значение F, a $message — "Хуже некуда!", и интерпретатор РНР переходит к выводу информации с использованием функции echo

Если фрагмент кода, выполняемый после проверки условия, состоит из одного выражения, фигурные скобки можно опустить. Допустим, в предыдущем примере инициализировалась только одна переменная $grade, т.е.
if ($grade > 92)
{
$grade = "А";
}

Теперь это выражение можно переписать следующим образом:
if ($grade > 92)
$grade = "А";

Такая сокращенная запись позволяет избежать написания лишнего кода. Однако, если имеется несколько выражений, это может привести к путанице.

Отрицание в операторе if

Если необходимо, чтобы блок операторов выполнялся в случае невыполнения некоторого условия, перед этим условием следует поставить восклицательный знак (!). Рассмотрим для примера следующее выражение:
if (еrеg("^С[а-я]*", $string))
{
$list[] = $string. "\n";
}

<? $stringg[0] = "Cadom";
$stringg[1] = "Gamor";
$stringg[2] = "Doom";
$stringg[3] = "Calc";
foreach($stringg as $id => $zna)
{
if(ereg("^C[a-z]*",$zna))
{
$list[] = $zna. "\n";
}
}

var_dump($list); echo "<br>";
?>
 $zna)
{
	if(ereg("^C[a-z]*",$zna))
		{
			$list[] = $zna. "\n";
		}
}		   
		
		var_dump($list); echo "
"; ?>

Этот условный оператор проверяет, начинается ли строка $string с символа С. Другими словами, если строка $string соответствует шаблону, определяющему строки, которые начинаются с символа С, за которым следуют буквы нижнего регистра, — блок операторов выполняется. Если перед условием поставить восклицательный знак, ситуация кардинально изменится:
if (!ereg("^С[а-я]*", $string)
{
$list[] = $string."\n";
}

В этом случае из-за наличия восклицательного знака (!) перед условным выражением массив $list будет содержать все строки, кроме тех, которые начинаются с символа С, т.е. условие истинно, если строка $string не начинается с символа С.

Вложенные операторы if

Условный оператор if можно использовать в другом условном операторе. Такое действие называется вложением (nesting). Пусть, например, необходимо связаться со всеми клиентами, которые живут в штате Айдахо (Idaho, ID). При этом клиентам, имеющим адрес электронной почты, нужно отправить электронное сообщение, а тем, кто его не имеет, — письмо по обычной почте. Это можно сделать с помощью вложенного оператора if:
if ($custState == "ID")
{
if ($EmailAdd = "")
{
$contactMethod = "по обычной почте";
}
else
{
$contactMethod = "по электронной почте";
}
}
else
{
$contactMethod = "нет необходимости";
}

Первое условие позволяет узнать, проживает ли клиент в штате Айдахо. Если это так, сценарий РНР проверит наличие адреса электронной почты. Если у клиента его нет, переменной $contactMethod (которая определяет вид связи) присваивается значение по обычной почте, иначе — по электронной почте. Если же клиент проживает не в штате Айдахо, ему ничего не отправляется.

Оператор switch

Во многих ситуациях оператор if работает отлично. Однако иногда имеется список условий, для каждого из которых необходимо выполнить свой набор операторов. Например, нужно написать сценарий, который будет вычислять налог с оборота. Как в этом случае учесть разную налоговую ставку для различных штатов? Именно для таких ситуащй и предназначен оператор switch.

Оператор switch проверяет значение некоторой переменной, и если оно совпадает с имеющимся в перечне, выполняются соответствующие операторы. Общий синтаксис инструкции switch имеет следующий вид:
switch ($имя_переменной)
{
case значение:
фрагмент кода;
break;
case значение:
фрагмент кода;
break;
default:
фрагмент кода;
break;
}

При выполнении оператора switch интерпретатор PHP пытается найти строку case, содержащую значение, равное значению переменной $имя_переменной. Если такая строка обнаружена, выполняется соответствующий фрагмент кода до оператора break. Если же найти такую строку не удалось, выполняется фрагмент кода, следующий после ключевого слова default. В операторе switch можно задавать любое количество вариантов. При этом использование ключевого слова default не обязательно, но при его наличии строку default обычно ставят в конце оператора switch. Однако для интерпретатора РНР это не имеет значения.

Рассмотрим следующий пример, учитывающий различные ставки на налог с оборота для различных штатов:
switch ($custState)
{
case "OR":
$salestaxrate = 0;
break;
case "CA":
$salestaxrate = 1.0;
break;
default:
$salestaxrate = .5;
break;
}
$salestax = $orderTotalCost*$salestaxrate;

В этом примере налог с оборота в штате Орегон равен 0%, в Калифорнии— 100%, а для всех остальных штатов — 50%. При выполнении оператора switch интерпретатор РНР пытается найти строку case, содержащую значение, равное значению переменной $custState. Если такая строка обнаружена, переменной $salestaxrate присваивается определенное значение. Например, если $custState равно ТХ (штат Техас), осуществляется переход к строке с ключевым словом default и переменной $salestaxrate присваивается значение .5. После выполнения оператора switch значение переменной $salestax будет равно половине (.5) от суммы заказа ($orderTotalCost).

Необходимо обратить внимание на операторы break, расположенные в конце каждого блока case. Если бы не они, интерпретатор РНР продолжал бы выполнять операторы либо до следующего оператора break, либо до конца инструкции switch. Это касается всех блоков case, кроме последнего.

Последний блок case оператора switch не требует оператора break. Однако его стоит использовать для большей ясности и согласованности кода.

Повторение действий с помощью циклов

Циклы очень часто используются в сценариях для многократного выполнения некоторых действий. При этом операции цикла повторяются либо некоторое наперед заданное количество раз, либо до выполнения определенных условий. Например, цикл, который выводит сокращенные названия штатов с помощью функции echo, необходимо повторить 50 раз, а цикл, который выводит имена файлов в каталоге, — пока не будут обработаны все файлы (независимо от их количества). В языке РНР существуют три типа циклов.

    for. Проверяет значение счетчика цикла и повторяет действия до тех пор, пока счетчик цикла не достигнет определенного значения.
whi1е. Проверяет условие и выполняет действия, пока условие не станет ложным
    do. .while. Выполняет действия и только потом проверяет условие. Если оно истинно — операторы цикла повторяются, в противном случае цикл прекращается.

В следующих разделах эти виды циклов рассматриваются более подробно.

Цикл for

Традиционный цикл for основан на счетчике. Сначала осуществляется инициализация переменной-счетчика, потом указывается ее конечное значение и определяется способ изменения состояния счетчика после выполнения набора действий. Общий синтаксис цикла for имеет следующий вид:
for (начальное_значение; конечное_условие; инкремент)
{
фрагмент кода;
}

Цикл for имеет следующие параметры.

    начальное_значение. Это выражение определяет переменную-счетчик цикла и инициализирует ее начальным значением. Например, выражение $i=l указывает, что в качестве счетчика будет использоваться переменная $i, а ее начальное значение равно 1. Обычно счетчик начинается с 0 или 1. При этом в качестве начального значения можно использовать число, числовое выражение (например, 2+2) или значение переменной.
конечное_условие. Это выражение определяет конечное значение счетчика. Цикл выполняется до тех пор, пока счетчик не достигнет этого значения. Рассмотрим, например, выражение $i<10, которое устанавливает конечное значение, равное 10. При достижении переменной $i этого значения цикл прекращается, поскольку условие $i<10 уже не будет выполняться. Выражение конечное_условие может также иметь вид $i<$size;.
    инкремент. Выражение, которое определяет, на какую величину будет изменяться счетчик. Например, выражение $i++; будет увеличивать значение переменной $i на единицу после выполнения каждой итерации (блока цикла)- Можно также использовать такие выражения, как $i=+l; или $i--;.

В цикле for в качестве счетчика используется некая переменная, скажем $i, значение которой изменяется в процессе выполнения цикла. При этом переменную-счетчик $i можно также использовать внутри цикла. Рассмотрим пример, в котором строка Здравствуй, мир! выводится три раза:

<?
for ($i=1; $i<=3; $i++)
{
echo "$i. Здравствуй, мир!<br>";
}
?>
"; } ?>

Вложенные циклы for

Один цикл for можно использовать внутри другого. Пусть, например, необходимо вывести таблицу умножения чисел от 1 до 9. Это можно сделать, используя следующий фрагмент кода:

<?
for ($i=1; $i<=9; $i++)
{
echo "\nУмножение на $i \n" ;
for($j=1; $j<=9; $j++)
{
$result = $i * $j;
echo "$i x $j = $result\n";
}
}

?>

Та же таблица умножения только компактнее:

";} else { echo "";} for($j=1; $j<=10; $j++) { if($j ==1){ echo ""; } echo ""; } echo "
<?
echo "<table border=\"1\">";
for ($i=1; $i<=10; $i++)
{
if($i == 1){echo "<tr bgcolor=\"\#003399\">";}
else { echo "<tr>";}
for($j=1; $j<=10; $j++)
{
if($j ==1){ echo "<td bgcolor=\"\#990066\">";}
else {echo "<td>";}

$result = $i * $j;
echo "$result\n";
echo "</td>";
}
echo "</tr>";

}
echo "</table>";
?>
"; for ($i=1; $i<=10; $i++) { if($i == 1){echo "
";} else {echo "";} $result = $i * $j; echo "$result\n"; echo "
"; ?>

Усложненные циклы for

Структура циклов for является достаточно гибкой и позволяет создавать циклы для самых разнообразных целей. Общий синтаксис цикла for можно представить в следующем виде:
for (начальное выражение; условное выражение; заключительное выражение)
{
фрагмент кода;
}

Параметры рассмотренного цикла for имеют следующее назначение.

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

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

Рассмотрим следующий пример:

<?
$t = 0;
for ($i=0, $j=1; $t<=4; $i++, $j++ )
{
$t = $i + $j;
echo "$t<br>";
}
?>
"; } ?>

В качестве начального выражения используется $i=0, $j=1, в качестве условной: — $t<=4, заключительного—$i++, $j++.

Теперь рассмотрим более подробно процесс выполнения этого цикла.

  1. Выполняется начальное выражение. При этом переменной $i присваивается значение 0, а переменной $j — 1.
  2. Проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку это так, то условие истинно и цикл продолжает выполняться.
  3. Выполняются действия внутри тела цикла. Значение переменной $t вычисляется как сумма $i и $j (0+1 равно 1) и с помощью функции echo выводится на экран.
  4. В конце данной итерации выполняется заключительное выражение: $i++ и $j++. Значения переменных $i и $j увеличиваются на единицу и становятся равными 1 и 2
  5. В начале следующей итерации проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку текущее значение $t равно 1, то условие истинно и цикл продолжает выполняться.
  6. Выполняются действия внутри цикла. Значение переменной $t вычисляется как сумма $i и $j (1+2 равно 3) и с помощью функции echo выводится на экран.
  7. В конце данной итерации выполняется заключительное выражение: $i++ и $j++. Значения переменных $i и $j увеличиваются на единицу и становятся равными 2 и 3.
  8. В начале следующей итерации проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку текущее значение $t равно 3, то условие верно и цикл продолжает выполняться.
  9. Выполняются действия внутри тела цикла. Значение переменной $t вычисляется как сумма $i и $j (2+3 равно 5) и с помощью функции echo выводится на экран.
  10. В конце данной итерации выполняется заключительное выражение: $i++ и $j++. Значения переменных $i и $j увеличиваются на единицу и становятся равными 3 и 4.
  11. В начале следующей итерации проверяется условное выражение. Не превышает ли значение переменной $t числа 4? Поскольку текущее значение $t равно 5, то условие ложно и цикл завершается.

Цикл while

Цикл while выполняет заданные действия до тех пор, пока истинно определенное условие. Этот вид цикла работает следующим образом.

  1. Задается условие.
  2. Это условие проверяется перед началом каждой итерации.
  3. Если условие истинно, цикл продолжает выполняться, в противном случае — завершается.

Общий синтаксис цикла while имеет следующий вид:
while ( условие )
{
фрагмент кода;
}

В следующем примере цикл while используется для нахождения в массиве $fruit значения яблоко:

<?
$fruit = array("апельсин", "яблоко", "виноград");
$testvar = "нет";
$k = 0;
while ( $testvar != "да" )
{
if ($fruit[$k] == "яблоко" )
{
$testvar = "да";
echo "яблоко"."<br>";
}
else
{
echo "$fruit[$k] - это не яблоко"."<br>";
}
$k++;
}
?>
"; } else { echo "$fruit[$k] - это не яблоко"."
"; } $k++; } ?>

Результат выведен в правой части таблицы.

Рассмотрим процесс выполнения этого цикла более подробно.

  1. Перед началом цикла инициализируются необходимые переменные. Создается массив $fruit с тремя элементами, тестовая переменная $testvar со значением нет и счетчик $k, принимающий значение 0.
  2. Цикл начинается с проверки на истинность условия $testvar != " да". Поскольку переменной $testvar было присвоено значение нет, условие верно и цикл не завершается.
  3. Проверяется условие в выражении if. Верно ли, что $fruit [$k] == "яблоко"? Текущее значение $k равно 0, и интерпретатор РНР проверяет на равенство первый элемент массива $fruit[0]. Поскольку в нем содержится значение апельсин, то рассматриваемое условие ложно, т.е. фрагмент кода, содержащийся после if, не выполняется и интерпретатор РНР переходит к обработке инструкции else.
  4. Выполняется фрагмент кода, содержащийся после else. Он выводит первую строку апельсин — это не яблоко.
  5. Значение переменной $k увеличивается на единицу и становится равным 1.
  6. Достигается конец цикла и интерпретатор РНР переходит к его началу.
  7. Снова проверяется на истинность условие $testvar != "да". Поскольку значение переменной $testvar не изменилось и равно нет, условие истинно и цикл не прекращается.
  8. Опять проверяется условие в выражении if. Верно ли, что $fruit[$k] == "яблоко"? Теперь текущее значение $k равно 1 и интерпретатор РНР проверяет второй элемент массива $fruit[l]. Поскольку в нем содержится значение яблоко, то рассматриваемое условие истинно, т.е. выполняется фрагмент кода, который следует за if.
  9. Выполняется фрагмент кода после оператора if. В нем переменной $testvar присваивается значение да и выводится вторая строка яблоко.
  10. Значение переменной $k снова увеличивается на единицу и становится равным 2.
  11. Достигается конец цикла, и интерпретатор РНР снова переходит к его началу.
  12. Последний раз проверяется истинность условия $testvar != "да". Поскольку значение переменной $testvar изменилось и стало равным да, условие ложно и цикл завершается.
Вполне возможно создать цикл while, который будет бесконечным, т.е. будет выполняться неограниченное количество раз. Это может произойти из-за того, что условие всегда будет оставаться истинным, т.е. если условие никогда не станет ложным, цикл никогда не завершится. Более подробно этот вопрос рассматривается ниже.

Цикл do. .while

Цикл do. .while очень схож с циклом while и выполняется до тех пор, пока истинны определенные условия. Однако в цикле do. .while условие проверяется не перед началом каждой итерации, а после ее завершения.

Общий синтаксис цикла do. . while имеет следующий вид:
do
{
фрагмент кода;
}while ( условие );

Перепишем предыдущий пример цикла while с использованием цикла do. .while. При этом результат выполнения будет один и тот же:

<?
$fruit = array("апельсин", "яблоко", "виноград");
$testvar = "нет";
$k = 0;
do {
if ($fruit[$k] == "яблоко" )
{
$testvar = "да";
echo "яблоко"."<br>";
}
else
{
echo "$fruit[$k] - это не яблоко"."<br>";
}
$k++;
}
while ( $testvar != "да" )
?>
"; } else { echo "$fruit[$k] - это не яблоко"."
"; } $k++; } while ( $testvar != "да" ) ?>

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

Изменим, например, в предыдущих двух циклах, while и do. .while, начальное значение переменной $testvar на да:
$testvar = "да";

В первом из них сначала проверяется условие, которое всегда ложно. Следовательно, цикл while никогда не будет выполнен. Во втором цикле do. .while итерация выполнится хотя бы один раз, и будет выведена одна строка:
апельсин — это не яблоко

Таким образом, в результате выполнения цикла do. .while перед проверкой условия будет выведена одна строка. Поскольку оно всегда ложно, последующие действия выполняться не будут.

Избегайте бесконечных циклов

Нетрудно создать цикл, который будет выполнятся неограниченное количество раз. Такие циклы называются бесконечными (infinite loop). Однако вряд ли кто-то создает их намеренно. Чаще всего — это ошибка в написании кода. Например, небольшое изменение фрагмента кода в примере с циклом while может привести к бесконечному циклу.

Модифицируем код сценария, который использовался ранее в этой главе:
$fruit = array("апельсин", "яблоко", "виноград");
$testvar = "нет";
while ( $testvar != "да" )
{
$k = 0; //!!!!!!!! модификация!!!!!!!!!
if ($fruit[$k] == "яблоко" )
{
$testvar = "да";
echo "яблоко\n";
}
else
{
echo "$fruit[$k] — это не яблоко\n";
}
$k++;
}

Небольшое изменение касается выражения $k = 0;, которое было внесено в цикл while извне. Эта модификация делает цикл бесконечным. В результате получим:
апельсин — это не яблоко
апельсин — это не яблоко
апельсин — это не яблоко
апельсин — это не яблоко
и так до бесконечности. При каждой новой итерации переменной $k присваивается значение 0 (несмотря на инкремент в конце цикла), и каждый раз проверяется первый элемент массива $fruit[0], содержащий значение апельсин, т.е. второй элемент массива (со значением яблоко) никогда не будет обработан, и значение переменной $testvar никогда не станет равным да. Таким образом, в результате получим бесконечный цикл.

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

    При использовании РНР для создания Web-страниц. Подождите, пока сценарий сам не остановится через короткое время. По умолчанию оно paвно 30 секундам, но может быть изменено администратором. Или щелкните на кнопке Стоп (Stop) в браузере, чтобы остановить выполнение сценария.
При использовании PHP CLI. Нажмите комбинацию клавиш <Ctrl+C>. Это поможет остановить выполнение сценария. Хотя некоторое время он еще может поработать, но остановится обязательно.

Затем найдите строку кода, генерирующую бесконечный цикл, и исправьте её.

Наиболее типичной ошибкой при написании циклов является использование при проверке условий одного знака равенства (=) вместо двух (==). Один знак равенства предназначен для присваивания значений переменным, а два знака— дня проверки условий. Соответственно следующее выражение всегда истинно:
while ($testvar = "да")
В нем переменной $testvar присваивается значение да. Это выражение никогда не станет ложным. Здесь, наверное, подразумевалось следующее:
while ($testvar == "да")

В отличие от предыдущего выражения здесь значение переменной $testvar сравнивается на равенство со значением да. При этом может быть получена как истина, так и ложь.

Еще одной ошибкой является отсутствие выражения, которое изменяет значение переменной-счетчика. Например, если в предыдущем примере кода удалить инкремент счетчика $k++;, то значение переменной $k будет неизменным и равным 0 и в результате получится бесконечный цикл.

Прерывание циклов

Иногда необходимо прервать выполнение цикла. В языке РНР это можно сделать двумя способами.

    Оператор break полностью прерывает выполнение цикла.
Оператор continue прерывает выполнение текущей итерации и переходит к следующей, если соответствующее условие выполнено.

Операторы break и continue обычно применяются в условных операторах. В частности, инструкция break чаще всего используется в конструкции switch. В следующих примерах показано различие в использовании операторов break и continue.

Приведем пример использования оператора break:

<?
$counter = 0;
while ( $counter <5 ) {
$counter++;
if ( $counter ==3)
{
echo "break\n";
break;
}
echo "Последняя строка цикла: счетчик=$counter\n";
}
echo "Первая строка после цикла\n\n";
?>

Следует заметить, что цикл останавливается сразу по достижения строки, содержащей оператор break, и переходит к выполнению команд после цикла while. Оператор continue действует по-другому.

Ниже приведен пример использования оператора continue.

<?
$counter = 0;
while ( $counter <5 )
{
$counter++;
if ($counter == 3 )
{
echo "continue\n";
continue;
}
echo "Последняя строка цикла: счетчик=$counter\n";
}
echo "Первая строка после цикла\n";
?>

В отличие от примера с использованием оператора break при достижении оператора continue цикл не завершается. Просто выполнение третьей итерации прерывается и происходит переход к следующей. Цикл завершается тогда, когда условие становится ложным (т.е. когда значение переменной $counter станет больше 5).

Оператор break также часто используется для предотвращения бесконечных циклов. Следующее выражение внутри цикла сможет предотвратить неограниченное количество повторений:
$test4infinity++;
if ($test4infinity >100 )
{
break;
}

Если известно, что цикл не должен повторяться больше 100 раз, приведенный фрагмент кода поможет избежать создания бесконечного цикла.

 

 

 

 

Глава 4 Глава 5 Глава 6 Глава 7 Глава 8 Глава 9


Февраль 2026 г
ПнВтСрЧтПтСбВс
05      1
062345678
079101112131415
0816171819202122
09232425262728 
Март 2026 г
ПнВтСрЧтПтСбВс
09      1
102345678
119101112131415
1216171819202122
1323242526272829
143031     
Апрель 2026 г
ПнВтСрЧтПтСбВс
14  12345
156789101112
1613141516171819
1720212223242526
1827282930   
End
fenita la comedia c 2026 End