- if, while, for, foreach

Печать: Шрифт: Абв Абв Абв
admin 26 Февраля 2006 в 22:01:14
Управляющие конструкции

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

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

Управляющие конструкции обычно проверяют условия на истинность или ложность, и в зависимости от результата проверки выполняется то или иное действие. Рассмотрим выражение $а == $b. Это выражение истинно, если $а равно $b, и ложно в противном случае. Результат истинного выражения считается равным 1, а результат ложного выражения равен 0. Рассмотрим следующий фрагмент:

<?
= 5;
$b = 5;
print
== $b;
?>


В результате выводится значение 1. Если изменить $а или $Ь и присвоить переменной значение, отличное от 5, выводится 0.

if

Команда if представляет собой разновидность команды выбора, которая вычисляет значение выражения и в зависимости от того, будет ли полученный результат истинным или ложным, выполняет (или не выполняет) блок программного кода. Существует две общих формы команды i f:

<?
if (выражение) {
блок
}
и
if (выражение) {
блок
}
else {
блок
}
?>

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

<?
if ($cooking_weight < 200) {
print
"This is enough pasta (< 200g) for 1-2 people";
}
else {
print
"That's a lot of pasta. Having a party perhaps?";
}
?>


Если в результате проверки условия выполняется всего одна команда, фигурные скобки не обязательны:

<? if ($cooking_weight < 100) print "Are you sure this is enough?";
elseif
?>


Команда elseif добавляет в управляющую конструкцию if дополнительный уровень проверки и увеличивает количество условий, на основании которых принимается решение:

<? if (выражение) {
блок
}
elseif (
выражение) {
блок
} ?>


В РНР существует альтернативное представление команды elself — в виде двух отдельных слов else if. Оба варианта приводят к одинаковым результатам, а альтернативное представление поддерживается исключительно для удобства. Команда elself особенно полезна в тех случаях, когда происходит последовательное уточнение проверяемых условий. Обратите внимание: условие elself вычисляется лишь в том случае, если все предшествующие условия if и elself оказались ложными.

<? if ($cooking_weight < 200) {
print
"This is enough pasta (< 200g) for 1-2 people";
}
elseif (
$cooking_weight < 500) {
print
"That's a lot of pasta. Having a party perhaps?"; }
}
else {
print
"Whoa! Who are you cooking for, a football team?";
}
?>


Вложенные команды if

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

<? // Проверить значение $pasta
if ($food == "pasta") {
// Проверить значение $cooking_weight
if ($cooking_weight < 200) {
print
"This is enough pasta (< 200g) for 1-2 people";
}
elseif (
$cooking_weight < 500) {
print
"That's a lot of pasta. Having a party perhaps?";
}
else {
print
"Whoa! Who are you cooking for. a football team?";
}
}
?>


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

Вычисление нескольких условий

При выборе логики работы программы в управляющей структуре можно проверять комбинацию сразу нескольких условий:

<? if ($cooking_weight < 0) {
print
"Invalid cooking weight!";
}
if ( (
$cooking_weight > 0) && ($cooking_weight < 200) ) {
print
"This is enough pasta (< 200g) for 1-2 people";
}
elseif ( (
$cooking_weight > 200) && ($cooking_weight < 500) ) {
print
"That's a lot of pasta. Having a party perhaps?";
}
else {
print
"Whoa! Who are you cooking for, a football team?";
}
?>


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

Альтернативное ограничение блоков

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

<?
if (выражение) :
блок
else :
блок
endif; ?>


Следовательно, две приведенных ниже команды if полностью эквивалентны:

<?
if (== $b) {
print
"Equivalent values!";
}
if (
$a == $b) :
print
"Equivalent values!";
endif;
?>


while

Конструкция while предназначена для многократного (циклического) выполнения блока команд. Блок команды while выполняется до тех пор, пока условие цикла остается истинным. Общая форма цикла while выглядит так:

<?
while (выражение) :
блок
endwhile;
?>


Рассмотрим использование цикла while на примере вычисления факториала (n!), где n = 5:
<?
$n
= 5;
$nсору = $n;
$factorial = 1; // Установить начальное значение факториала
while ($n > 0) :
$factorial - $n * $factorial;
$n--; // Уменьшить $n на 1
endwhile;
print
"The factorial of $ncopy is $factorial.";
?>


Программа выводит следующий результат:

Quote:
The factorial of 5 is 120.


В этом примере $n уменьшается в конце каждой итерации. Условие цикла не должно быть истинным в тот момент, когда переменная $n станет равна 0, поскольку величина $factorial умножится на 0 — конечно, этого быть не должно.

В приведенном примере условие цикла следовало бы оптимизировать и привести его к виду $n > 1, поскольку умножать $factorial на 1 бессмысленно — число от этого не изменится. Хотя ускорение работы программы будет ничтожно малым, такие факторы всегда принимаются во внимание с ростом объема и сложности программ.

do. .while

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

do:
блок
while (выражение);


Давайте пересмотрим пример с вычислением факториала и перепишем его с использованием конструкции do. .while:

<?
$n
= 5:
$ncopy = $n;
$factorial = 1; // Установить начальное значение факториала
do {
$factorial = $n * $factorial;
$n--: // Уменьшить Sn на 1
} while (Sn > 0);
print
"The factorial of Sncopy is $factorial.";
?>
При выполнении этого примера будет получен тот же результат, что и при выполнении его прототипа из предыдущего раздела.

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

for

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

управляющей конструкции, а не где-то внутри блока команд. Как и в случае с циклом while, цикл выполняется до тех пор, пока проверяемое условие остается истинным. Общая форма конструкции for выглядит так:

<?
for (инициализация: условие; приращение) {
блок
}
?>


Условная часть цикла for в действительности состоит из трех компонентов. Инициализация выполняется всего один раз и определяет начальное значение управляющей переменной цикла. Условие проверяется в начале каждой итерации и определяет, должна ли выполняться текущая итерация или нет. Наконец, приращение определяет изменение управляющей переменной при каждой итерации. Возможно, термин «приращение» в данном случае неточен, поскольку переменная может как увеличиваться, так и уменьшаться в соответствии с намерениями программиста. Следующий пример демонстрирует простейший случай применения цикла for:
<?
for ($i = 10; $1 <- 100: $1 +=10) : // Обратная косая черта предотвращает
print "$i = $i <br>"; endfor; // возможную интерполяцию переменной $1
?>
Выполнение этого фрагмента дает следующий результат:
Quote:
$i = 10
$i = 20
$i = 30
$i = 40
$i - 50
$i = 60
$i = 70
$i = 80
$i = 90
$i = 100


В этом примере управляющая переменная $i инициализируется значением 10. Условие заключается в том, что цикл продолжается до тех пор, пока $i не достигнет или не превысит пороговую величину 100. Наконец, при каждой итерации значение $i увеличивается на 10. В результате команда print выполняется 10 раз, каждый раз выводя текущее значение $i. Обратите внимание: для увеличения $i на 10 используется оператор сложения с присваиванием. Для этого есть веские причины, поскольку циклы for в РНР не поддерживают более традиционной записи $i = $i + 10.

Кстати, этот пример можно записать и в другом виде, но с теми же результатами:

<?for ($i = 10; $i <= 100; print "$i - $i <br>". $i+=10);?>

Многие новички не понимают, зачем создавать несколько разновидностей циклов в языке программирования, будь то РНР или какой-нибудь другой язык. Почему нельзя обойтись одной циклической конструкцией? Дело в том, что у цикла for существует несколько специфических особенностей.

Например, вы можете инициализировать несколько переменных одновременно, разделяя команды инициализации запятыми:

<?
for ($x=0,$y=0: $x+$y<10; $x++) :
+= 2; // Увеличить $у на 2
print "$y = $y <BR>"; // Вывести значение $у
$sum = $x + $y;
print
"surn = $sum<BR>"; // Вывести значение $sum
endfor;
?>


Результат:

Quote:
$y = 2
$sum = 2
Sy = 4
$sum = 5
$y = 6
$sum = 8
$y = 8
$sum = 11


Этот пример выводит текущие значения $y и суммы $х и $у. Как видно из приведенных результатов, выводится значение $sum = 11, хотя эта сумма выходит за границы условия цикла ($х + $у < 10). Это происходит из-за того, что при входе в данную итерацию переменная $у была равна 6, а переменная $х была равна 2. Значения переменных соответствовали условию цикла, поэтому $х и $у были присвоены новые значения, в результате чего была выведена сумма И. При очередной проверке условия сумма 11 превысила пороговое значение 10 и цикл завершился.

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

<?
= 5:
for (: :
+=2) :
print
" ";
if (
$x == 15) :
break;
// Выйти из цикла for
endif;
endfor;
?>


Результат выглядит так:

Quote:
5 7 9 11 13 15


Хотя циклические конструкции for и while выполняют практически одинаковые функции, считается, что цикл for делает программу более наглядной. Это объясняется тем, что программист при виде команды for немедленно получает всю необходимую информацию о механике и продолжительности цикла. С другой стороны, в командах while приходится тратить лишнее время на поиск обновлений управляющих переменных — в больших программах это может занимать немало времени.

foreach

Конструкция foreach представляет собой разновидность for, включенную в язык для упрощения перебора элементов массива. Существуют две разновидности команды foreach, предназначенные для разных типов массивов:

<?
foreach (массив as $элемент) {
блок
}
foreach (
массив as $ключ => $элемент) {
блок
}
?>


Например, при выполнении следующего фрагмента:

<?
$menu
= аrrау("pasta", "steak", "potatoes", "fish", "fries");
foreach (
$menu as $item) {
print
"$item <BR>";
}
?>


будет выведен следующий результат:

Quote:
pasta
steak
potatoes
fish
fries


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

Второй вариант используется при работе с ассоциативными массивами:

<?
$wine_inventory
= array {
"merlot" => 15,
"zinfandel" => 17,
"sauvignon" => 32
}
foreach (
$wine_inventory as $i => $item_count) {
print
"$item_count bottles of $i remaining<BR>";
}
?>


В этом случае результат выглядит так:

Quote:
15 bottles of merlot remaining
17 bottles of zinfandel remaining
32 bottles of sauvignon remaining


Как видно из приведенных примеров, конструкция foreach заметно упрощает работу с массивами. За дополнительной информацией о массивах обращайтесь к главе 5.

Добавить сообщение
Чтобы добавлять комментарии зарeгиcтрирyйтeсь