Vícenásobné větvení

Často bývá v programech potřeba dělit jejich běh ne jen do dvou větví jako v minulé lekci, ale do více větví. Pro složitější větvení bychom mohli využít vnořování příkazů IF (IF podmínka příkaz; else if podmínka příkaz), to by ale mohlo být u složitějšího větvení nepřehledné (hlavně, ke kterému IF přísluší které ELSE). Pro vícenásobné větvení jsou v PHP k dispozici také další příkazy - elseif a switch .


Vnořené IF a příkaz ELSEIF

Při složitějším větvení programu můžeme vnořit příkazy if do sebe, například takto:
  if ($a > $b)
  {
    echo "\$a je větší než \$b";
  }
  else
  {
    if (!($a == $b))
    {
      echo "\$a je menší než \$b";
    }
    else
    {
      echo "\$a je rovno \$b";
    }
  }
  if ($a > $b)
  {  echo "\$a je větší než \$b";  }
  else
  {
    if (!($a == $b))
    {  echo "\$a je menší než \$b";   }
    else
    {   echo "\$a je rovno \$b";   }
  }
Ukázka vlevo je schválně rozepsaná do více řádků, aby byla srozumitelnější (nebo taky ne :-) ), složené závorky samozřejmě nemusí být na řádku samostatně, jak ukazuje zápis vpravo, který znamená totéž. Protože je ve složené závorce vždy jen jeden příkaz, mohli jsme většinu z nich vynechat, potom si ale zkuste představit, že vynecháme první else - bez závorek by nebylo jasné, ke kterému if by druhé else patřilo (není-li uzávorkováno, patří vždy else k nejbližšímu if).

Přehlednější pro vícenásobné větvení může být při větším počtu větví použití příkazu elseif, který se používá takto:
if (podmínka1)
{
příkazy1;
}
elseif (podmínka2)
{
příkazy2;
}
else
{
příkazy3;
}
Jestliže je splněna podmínka1, vykonají se příkazy1 (je-li jen jeden příkaz, nemusí být v závorce), není-li splněna podmínka1 a je splněna podmínka2, potom se vykonají příkazy2, není-li splněna ani jedna z prvních dvou podmínek, potom se vykonají příkazy3. Lepší bude uvést konkrétní příklad:

if ($pocet_chyb == 0) echo "Výborně! Žádná chyba je skvělý výsledek.";
elseif ($pocet_chyb < 2) echo "Výborný výsledek.";
elseif ($pocet_chyb < 3) echo "Ještě dobrý výsledek.";
else echo "Žádný učený z nebe nespadl.";
Například při jedné chybě se vypíše "Výborný výsledek", ale nevypíše se už "Ještě dobrý výsledek", kdo nevěří, ať si zkusí.

Další možností pro příkazy if, elseif je nahradit složené závorky dvojtečkou, potom je ale nutné ukončit větvení příkazem endif, protože by nebylo jasné, kde potřebné příkazy končí:

if ($pocet_chyb == 0):
echo "Výborně! Žádná chyba je pěkný výsledek.";
echo "Doufám, že ti nepomáhala babička!";
elseif ($pocet_chyb < 5):
echo "Ještě docela dobrý výsledek.";
echo "Chybí ti jen krůček k dokonalosti.";
else:
echo "Žádný učený z nebe nespadl.";
endif;
Pozn.: Výpisy jsou zde rozdělené do dvou příkazů jen proto, aby bylo vidět, jak se v tomto případě zapisuje více příkazů v každé větvi.

V různých programech můžete narazit na kombinování příkazů PHP a HTML v příkazech IF, já se těmto konstrukcím budu vyhýbat, protože nejsou přehledné ani moc programátorsky logické (všimněte si otevřené složené závorky v první části ukázky a jejího uzavření až za příkazy HTML):

<?php
if (empty ($_REQUEST))
{
?>
<form method="get" action="">
Příjmení: <input name="prijmeni">
<input type="Submit" name="odesli">
</form>
<?php
}
else
{
echo "Mám tě, odeslaný formuláři!
Tys vyplnil ".$_REQUEST["prijmeni"];
}
?>

Příkaz SWITCH

Příkaz switch využijeme pro větvení programu na základě konkrétně určených hodnot vybrané proměnné (nelze použít znaménka < ani > ). Syntaxi si ukážeme na konkrétním příkladě:
<?php $jmeno="Dominik";
switch ($jmeno) {
case "Michal": echo ("Vítej Michale"); break;
case "Martin": echo ("Vítej Martine"); break;
case "Jirka": echo ("Vítej Jirko"); break;
case "Dominik": echo ("Vítej Dominiku"); break;
default: echo ("Vítej neznámý vojíne"); } ?>

Z ukázky je jasné, že se bude vypisovat hláška podle toho, které jméno je uložené v proměnné $jmeno, v možnosti default je (nebo jsou) příkaz, který se vykoná, pokud není v proměnné žádná z vyjmenovaných hodnot (také je možné místo dvojtečky uzavřít příkazy do složené závorky).


Uvedené příkazy vyzkoušíme na jednoduchém zábavném testu pro volné chvíle založeném na numerologii. Na rozdíl od minulé lekce zkusíme tenotkrát spojit zadávací formulář i jeho vyhodnocení do jednoho souboru php.

Partnerský test

V tomto numerologickém testu si podle návodu každý z partnerů ze svého jména vypočte svoje osobní duševní číslo a po zadání do formuláře jim test vypíše jejich vlastnosti.

Formulář pro zadání čísel i jeho vyhodnocení tentokrát vložíme do jednoho souboru (partner.php):

<h1>Partnerský test</h1>

Nejprve z celých jmen partnera a partnerky vypočtěte osobní čísla tak, že za každou samohlásku budete počítat číslo podle tabulky a číslice vzniklého součtu sčítejte tak dlouho, až vyjde číslo menší než deset.<br>
a=1, e=5, i (nebo y)=9, o=6,u=3<br>
Například: Alice Boudová - a = 1, i = 9, e = 5, o = 6, u = 3, o = 6, a = 1: 1+9+5+6+3+6+1 = 31, 3+1 = 4, osobní číslo je 4.<br>br /><br>

Zadejte osobní čísla obou partnerů a program vyhodnotí vaši shodu:<br /><br />

<form name="partneri" action="partner.php" method="post">
Ona: <input type="text" name="ona" value="" />
On: <input type="text" name="on" value="" />
<input type="submit" value="vyhodnoť" />
</form>

První část souboru tvoří HTML kód, ve kterém je návod pro výpočet osobních čísel a formulář pro jejich zadání. Nová věc ve formuláři je ta, že hodnota jeho parametru action je název téhož souboru, ve kterém je formulář (i dále vyhodnocení) uložený - v takovém případě dokonce ani název být uvedený nemusel (může být action="").

Druhá část souboru partner.php má formulář vyhodnotit, bude tedy obsahovat kód PHP. Problém je, jak má program poznat, jestli už má vyhodnotit nebo ne, čili jestli už byl odeslaný formulář. Někteří autoři to řeší za pomoci hodnot neviditelných polí formuláře (s parametrem hidden), jestliže hodnota tohoto pole je, byl už formulář odeslaný. Druhá metoda (podle mně jednodušší, "programátorštější" a hlavně vždy fungující) spočívá v tom, že se podíváme, jestli je prázdné pole $_POST, ve kterém se odesílají hodnoty proměnných z formuláře. Příkaz
if (!empty ($_POST))
znamená: jestli pole $_POST není prázdné, to je v případě, že už obsahuje nějakou hodnotu a tudíž byl formulář už odeslaný. Kód PHP pro tuto stránku by tudíž mohl vypadat takto:

<?php
if (!empty ($_POST))
{ echo "<b>ONA:</b><br />";
switch($_POST["ona"])
{case 1: echo"Jsi silná osobnost, nezávislá, sebejistá a kreativní. A proto ve vztahu potřebuješ tu a tam i čas jen sama pro sebe. Dopřej tuhle volnost i svému partnerovi a dávej si pozor na to, abys nebyla příliš majetnická a žárlivá.";
break;
case 2: echo"Jsi hodně citově založená, toužíš po harmonii a romantice. Často trpíš prudkými změnami nálad. Tvojí silnou touhou je milovat a být milována. Snaž se na toho druhého tolik nevázat.";
break;
case 3: echo"Jsi chytrá, vtipná, šarmantní a chceš se vždycky bavit. Rychle a silně se zamiluješ. Ale stejně rychle tě to zase přejde, pokud to neklape. První lekce zní: ke vztahu nepatří jen zábava, ale taky odpovědnost a výdrž.";
break;}

echo "<br /><br /><b>ON:</b><br />";
switch($_POST["on"])
{case 1: echo"Přesně víš co chceš a jak toho dosáhnout. Rád přebíráš iniciativu, jsi vášnivý a často udáváš směr. Potřebuješ, aby tě někdo ujišťoval o tom, že jsi nejlepší. Na druhou stranu, pokud jsi opravdu zamilovaný, jsi absolutně věrný.";
break;
case 2: echo"Jsi empatický a citlivý. Naprosto tě vystihuje neustálé hledání velké a opravdové lásky. Jsi něžný a ženy okouzluješ svým smyslem pro romantiku.";
break;
case 3: echo"Jsi sebevědomý typ, který je často středem pozornosti. Nikdo neumí flirtovat jako ty, ale potřebuješ také, aby tě neustále někdo obdivoval, především partnerka.";
break;}
}
?>


Kód je sice delší, ale to jen kvůli vypisovaným textům. Když se podíváte pozorněji, vidíte, že v podstatě obsahuje jen dva příkazy switch, pomocí kterých vypisuje texty příslušné vloženým osobním číslům. Na rozdíl od předešlých programů jsme také nezaváděli nové proměnné pro načtení hodnot z formuláře (třeba $on=$_POST["on"]), ale v podmínkách jsme použili rovnou hodnoty pole $_POST (například switch($_POST["on"]) ).


Úkoly:

Úkol (3 body)

Vytvořte test podle textu lekce a doplňte jej o vyhodnocení vztahu. Číslo vztahu je rozdíl obou osobních čísel (dej pozor na to, že by mohl být záporný). Příslušné texty pro jednotlivá čísla najdeš v souboru partner.txt , použij alespoň první tři.

Úkol (5 bodů a více podle vzhledu)

Vytvoř kompletní on-line "Partnerský test" - doplň do něj hodnotící texty pro všechna osobní čísla i čísla vztahů a vzhledově vylepši.

Úkol (8 bodů a více podle vzhledu)

Vytvoř psychologický on-line test "Jaký jsi" s využitím přiloženého dokumentu (.doc) převzatého z knihy E. Bakaláře "I dospělí si mohou hrát".

Název školy:Základní škola, Hradec Králové, M. Horákové 258
Název projektu:EU peníze školám
Číslo projektu:CZ.1.07/1.4.00/21.2575
Téma:Programování v PHP
Název:VY_32_INOVACE_06_10A_PHP6
Autor:Pavel Petr
Použité zdroje: Není-li uvedeno jinak, jsou všechny ilustrační obrázky dílem autora.