Управляющие структуры. Решения на основе условий

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

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

Операторы if

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

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

Если посетитель вообще не заказал запчасти, имеет смысл вывести сообщение наподобие Вы ничего не заказали, повторите заказ!. Это легко сделать с помощью оператора if:

if ($totalqty == 0)

echo 'Вы ничего не заказали, повторите заказ! <br>';

В этом операторе используется условие $totalqty == 0. Помните, что операция равенства (==) ведет себя иначе, нежели операция присваивания (=).

Условие $totalqty == 0 будет иметь значение true, если значение переменной $totalqty равно нулю. Если значение переменной $totalqty не равно нулю, значение условия будет равно false. Когда значение будет true, оператор echo выполнится.

Блоки кода

Часто внутри такого условного оператора, как if, требуется выполнить более одного оператора. В этом случае соответствующая последовательность операторов записывается в виде блока. Чтобы объявить блок, операторы потребуется заключить в фигурные скобки:

if ($totalqty == 0)

{

echo '<font color=red>';

echo 'Вы ничего не заказали, повторите заказ!<br>';

echo '</font>';

}

Три строки кода, заключенные в фигурные скобки, теперь представляют собой блок. Когда значением условия true, выполняются все три строки. Если значением условия будет false, все три строки будут проигнорированы.

Операторы else

Часто не только приходится решение, должно или не должно выполняться то или иное действие, но и выбирать это действие из некоторого набора возможных действий.

Оператьр else позволяет определить альтернативное действие, которое должно выполняться, если значение условия в операторе if окажется равным false. Скажем, в рассматриваемом примере необходимо предупредить клиента о том, что он ничего не заказал. С другой стороны, если он сделал заказ, вместо предупреждения ему должен выводиться список заказанных товаров.

Если немного изменить код и добавить в него оператор else, можно отображать либо уведомление, либо итоговую информацию.

if ($totalqty == 0)

{

echo 'Вы ничего не заказали, повторите заказ!<br>';

}

else

{

echo $filtr. " - фильтр масляный <br>";
echo $filtr_v. " - фильтр воздушный<br>";
echo $sparkqty. " - свечи зажигания <br>";

}

Вкладывая оператор if один в другой, можно строить более сложные логические цепочки. Приведенный ниже код не только обеспечивает отображение итоговой информации, когда значение $totalqty == 0 равно true, но и отображает каждую из итоговых строк при выполнении ее собственного условия.

if ($totalqty == 0)

{

echo 'Вы ничего не заказали, повторите заказ!<br>';

}

else

{

if ($filtr > 0)
echo $filtr. " - фильтр масляный <br>";
if($filtr_v >0)
echo $filtr_v. " - фильтр воздушный<br>";
if ($sparkqty >0)
echo $sparkqty. " - свечи зажигания <br>";

}

Файл processor.php бедет иметь следующий вид:

<?php
//создаем короткие имена переменным
$filtr = $_POST['filtr'];
$filtr_v = $_POST['filtr_v'];
$sparkqty = $_POST['sparkqty'];
//Объявляем константы
define ('FILTRPRICE', 20);
define ('FILTRVPRICE', 10);
define ('SPARKPRICE', 4);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Компания АВС. Результаты заказа</title>
<link href="../../svd.css" rel="stylesheet" type="text/css">
</head>

<body>
<h2>Компания АВС</h2>
<h3>Результаты заказа</h3>
<?php
echo "<p>Заказ обработан в ";
echo date('H:i, j F');
echo "</p>";
echo "<p>Список вашего заказа:</p>";
echo $filtr. " - фильтр масляный <br>";
echo $filtr_v. " - фильтр воздушный<br>";
echo $sparkqty. " - свечи зажигания <br>";
$totalqty = 0;
$totalqty = $filtr + $filtr_v + $sparkqty;
echo 'Заказано товаров: '.$totalqty. '<br>';
if ($totalqty == 0)
{
echo '<font color=red>';
echo 'Вы ничего не заказали, повторите заказ!<br>';
echo '</font>';
}
else
{
if($filtr >0)
echo $filtr. " - фильтр масляный <br>";
if($filtr_v >0)
echo $filtr_v. " - фильтр воздушный<br>";
if($sparkqty >0)
echo $sparkqty. " - свечи зажигания <br>";
}

$totalamount = 0.00;
$totalamount = $filtr * FILTRPRICE
+ $filtr_v * FILTRVPRICE
+ $sparkqty * SPARKPRICE;
echo 'Итого: '.number_format($totalamount,2). ' RUB<br>';
$ndc = 0.18; //Налог НДС составляет 18%
$totalamount = $totalamount * (1 + $ndc);
echo 'Всего, включая НДС: '.$totalamount. ' RUB<br>';
?>
</body>
</html>

А теперь откроем страницу с формой, заполним ее (или не заполним, или заполним частично) и проверим работу скрипта.

В окне веб-браузера это будет выглядеть ТАК.

Операторы elseif

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

Компания АВС предоставляе скидки при заказе большого количества фильтров. Схема скидок выглядит следующим образом:

Приобретение менее 100 фильтров — без скидки.

Приобретение от 100 до 500 фильтров — скидка 5%.

Приобретение от 500 до 1000 фильтров — скидка 10%.

Приобретение 1000 и более фильтров — скидка 15%.

Можно подготовить програмный код, вычисляющий скидки, с использований условий операторов if и else. Для объединения двух условий в одно применяется операция И (&&).

if ($filtr < 100)

$discount = 0;

elseif ( $filtr >=100 && $filtr <= 500)

$discount = 5;

elseif ($filtr >=500 && $filtr <=1000)

$discount =10;

elseif ($filtr > 1000)

$discount =15;

Обратите внимание на то, что можно применять как elseif, так и else if — с пробелом или без; оба варианта допустимы.

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

Операторы switch

Оператор switch работает аналогично оператору if, но позволяет условному выражению иметь в качестве результата более двух значений. В операторе if условие принимает значение true или false. В операторе switch условие может принимать любое число различных значений в тех случаях, когда результат его вычисления принимает простой тип (integer, string или float). Xnj,s иметь возможность реагировать на каждое такое значение, вы должны предусмотреть для него соответствующий оператор case, а также (не обязательно) определить действия, выполнимые по умолчанию, когда возникает случай, не предусмотренный конкретным оператором case.

В компании АВС желают знать, какие формы рекламы содействуют успеху. Для этого в форму заказа добавлен вопрос: "Как вы нашли нашу компанию?".

Вот фрагмент этого кода:

<tr>
<td>Как вы нашли нашу компанию</td>
<td><select name="find">
<option value="a" selected>Я регулярный клиент</option>
<option value="b">Увидел в рекламе</option>
<option value="с">По рекомендации</option>
</select></td>
</tr>

В показанном коде есть новые переменные формы, значения которых 'a', 'b', 'c'. Эти переменные можно было бы обработать с помощью последовательности операторов if и else:

if ($find == 'a')

echo '<p> Я регулярный клиент</p>';

elseif ($find == 'b')

echo '<p> Увидел в рекламе </p>';

elseif ($find == 'c')

echo '<p> По рекомендации </p>';

В качестве альтернативы можно воспользоваться оператором switch:

switch ($find)

{

case 'a':

echo '<p> Я регулярный клиент</p>';

break;

case 'b':

echo '<p> Увидел в рекламе </p>';

break;

case 'c':

echo '<p> По рекомендации </p>';

break;

В последних двух примерах предполагается, что мы уже получили переменную $find из массива $_POST.

Оператор switch ведет себя несколько иначе, чем оператор if или elseif. Оператор if выбирает на выполнение только один опрератор, если специально не использует фигурные скобки для создания блока операторов. Оператор switch действует по другому принципу. Когда оператор case в рамках оператора switch активизируется, РНР выполняет следующие заним операторы, один за другим, пока не столкнется с оператором break. Без него оператор switch выполнил бы весь код, следующий за оператором case, условие которого равно true. По достижении оператора break выполняется строка кода, следующего за оператором switch.

Сравнение различных условных операторов

Если вы не работали с операторами, описанными в предыдущих разделах, у вас вполне может возникнуть вопрос:"Какой из них самый лучший?"

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

назадвверхвперед
Rambler's Top100