Podmínky, podmínkové příkazy

Jste zde

K čemu slouží podmínky v PHP, je pravděpodobně snadno pochopitelné i bez teoretických znalostí. Část skriptu se má vykonat pouze tehdy, jestliže je (nebo není) splněna nějaká podmínka, ve složitějších případech kombinace podmínek.

V našem příkladu Zpráva pro tento den budeme pochopitelně chtít, aby se zpráva zobrazovala v závislosti na tom, jaký je právě den - a právě k tomu podmínky využijeme.

Poznámka k teorii: v řadě učebnic se podmínkové příkazy řadí mezi tzv. řídící struktury, podobně jako příkaz return.

Příkaz if

Základní příkaz, který umožňuje rozvětvit kód podmínkou. Syntaxe je následující:

if (VÝRAZ- tj. „obsah“ podmínky) {
  PŘÍKAZ, který se má vykonat
}

Upravme nyní příklad Zpráva pro tento den. Kromě univerzální zprávy bude zobrazovat specifickou část, která se zobrazí pouze v určitý den (např. v pondělí, upravte si podle situace, tak, abyste vyzkoušeli zobrazení i nezobrazení zprávy).

<h4>Zpráva pro tento den</h4>
<?php
$name = 'Zdeněk';
function daily_message($name, $day) {
  //Přidáme 2 proměné pro počáteční a koncovou část zprávy, které se nebudou měnit
  $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>';
  $default_message2 = '<p>Ať se vám dnes všechno daří!</p>';
  //Přidáme proměnnou $daily_message pro specifickou zprávu a naplníme ji prázdnou hodnotou
  $daily_message = '';
  //Nyní vložíme podmínku. Pokud je pondělí, proměnná $daily_message změní hodnotu
  if ($day == 'Pondělí') {
    $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>';
  }
  //Spojíme všechny části zprávy.
  $message = $default_message1 . $daily_message . $default_message2;
  return ($message);
}
$day = t(date('l'));
print daily_message($name, $day);
?>

Výsledek (pro situaci, že v podmínce je Pondělí a je skutečně pondělí:

Zpráva pro tento den

Jste přihlášeni k účtu Zdeněk. Dnes je Pondělí.

Nezapomeňte, ve 14 hod. je porada.

Ať se vám dnes všechno daří!

Tento skript má daleko k dokonalosti, především proto, že „natvrdo“ pracuje pouze s českým překladem data a ještě ke všemu vyžaduje, aby podmínka obsahovala přesný řetězec včetně velkého písmene na začátku (schválně zkuste napsat pondělí namísto Pondělí: podmínka se vyhodnotí jako nepravdivá i v případě, že je pondělí). Nám však jde o vysvětlení a procvičení podmínkových příkazů, proto se nyní soustředíme na ně a opomineme ostatní funkcionalitu.

Kombinace if ... else

Nyní příklad upravíme tak, aby se při nesplnění podmínky zobrazil jiný (výchozí) text. To obstará kombinace příkazů if ... else.

Příkaz else odvětví část skriptu, která se provede v případě, že není splněna podmínka.

<h4>Zpráva pro tento den</h4>
<?php
$name = 'Zdeněk';
function daily_message($name, $day) {
  //Přidáme 2 proměné pro počáteční a koncovou část zprávy, které se nebudou měnit
  $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>';
  $default_message2 = '<p>Ať se vám dnes všechno daří!</p>';
  //Přidáme proměnnou $daily_message pro specifickou zprávu a naplníme ji prázdnou hodnotou
  $daily_message = '';
  //Nyní vložíme podmínku, která má 2 větve. První pro případ, že je pondělí, druhou (else) pro všechny ostatní situace.
  if ($day == 'Pondělí') {
    $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>';
  } else {
  $daily_message = '<p>Dnes se neděje nic zvláštního. </p>';
}
  //Spojíme všechny části zprávy.
  $message = $default_message1 . $daily_message . $default_message2;
  return ($message);
}
$day = t(date('l'));
print daily_message($name, $day);
?>

Kombinace if - else vyjadřuje situaci „buď - anebo“. Pro složitější situace, kdy existuje více variant, potřebujeme další příkazy.

Příkaz elseif a switch

Příkazy elseif a switch umožňují vyhodnotit více variant, tedy rozvětvit skript na více větví než 2. Oba příkazy se používají v podobných situacích. Zatímco u menšího počtu variant se většinou používá příkaz elseif, u většího počtu variant příkaz switch (zápis je o něco stručnější). Vyzkoušíme je postupně.

Nyní náš příklad upravíme pro 3 možné varianty. Pokud je pondělí, informujeme o poradě. Jestliže je pátek, připomínáme odevzdání týdenního výkazu. V ostatních případech zobrazíme výchozí zprávu.

Příkaz elseif si můžete volně přeložit jako „pokud ne, pak jestliže...“. Navazuje tedy na nesplnění první podmínky a zahajuje vyhodnocení podmínky další.

<h4>Zpráva pro tento den</h4>
<?php
$name = 'Zdeněk';
function daily_message($name, $day) {
  $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>';
  $default_message2 = '<p>Ať se vám dnes všechno daří!</p>';
  $daily_message = '';
  //Nyní vložíme podmínku, která má 3 větve. První pro případ, že je pondělí, druhou (elseif) pro případ, že je pátek, třetí (else) pro všechny ostatní situace.
  if ($day == 'Pondělí') {
    $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>';
  } elseif ($day == 'Pátek') {
    $daily_message = '<p>Nezapomeňte odevzdat týdenní výkaz. </p>';
  } else {
  $daily_message = '<p>Dnes se neděje nic zvláštního. </p>';
}
  $message = $default_message1 . $daily_message . $default_message2;
  return ($message);
}
$day = t(date('l'));
print daily_message($name, $day);
?>

Jak jsme si už řekli, stejného výstupu můžeme dosáhnout pomocí příkazu switch, který má však zcela jinou syntaxi:

switch (HODNOTA proměnné) { 
  case 'HODNOTA1': 
    příkaz(y); 
    break; 
  case 'HODNOTA2': 
    PŘÍKAZY; 
    break; 
 
    (...) 
 
  default: 
    PŘÍKAZY; 
}

Význam jednotlivých částí této struktury ozřejmí již pouhý překlad použitých termínů z angličtiny:

  • switch - přepni (tj. přepínej hodnoty určité proměnné)
  • case - v případě, že
  • default - výchozí stav (nastane, pokud nenastala žádná z variant „case“).
  • break - přerušit (ukončit procházení větví struktury).

Zastavme se u příkazu break. Jeho význam není na první pohled zřejmý, pokud by však chyběl, skript vykoná všechny větve struktury.

Nyní upravíme náš příklad - k dosažení stejného výsledku použijeme příkaz switch.

<h4>Zpráva pro tento den</h4>
<?php
$name = 'Zdeněk';
function daily_message($name, $day) {
  $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>';
  $default_message2 = '<p>Ať se vám dnes všechno daří!</p>';
  $daily_message = '';
  //Nyní vložíme podmínku, která má 3 větve. První pro případ, že je pondělí, druhou (elseif) pro případ, že je pátek, třetí (else) pro všechny ostatní situace.
  switch ($day) {
    case 'Pondělí':
      $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>';
      break;
    case 'Pátek':
      $daily_message = '<p>Nezapomeňte odevzdat týdenní výkaz. </p>';
      break;
    default:
      $daily_message = '<p>Dnes se neděje nic zvláštního. </p>';
}
  $message = $default_message1 . $daily_message . $default_message2;
  return ($message);
}
$day = t(date('l'));
print daily_message($name, $day);
?>

K procvičení příkazu switch a také pro zpříjemnění výstupu skriptu :-) nyní vložte ještě jednu větev navíc:

case 'Čtvrtek':
  $daily_message = '<p>Dnes večer můžete využít firemní vstupenky do wellnes centra, od 18 do 21 hod., jako obvykle. Platí pro 2 osoby, užijte si to. </p>';
  break;

Příkaz switch by se nehodil pro případy, kdy je třeba vyhodnotit složitější podmínku, než jen hodnotu určité proměnné. Kdyby např. jedna z větví obsahovala podmínku pro den v týdnu a současně pro funkci na pracovišti (třeba pro zobrazení specifické zprávy vedoucím), bylo by nutné použít příkaz elseif.

Alternativní způsoby zápisu

Pro některé řídící struktury je k dispozici také alternativní syntax, kterou názorně (jak doufáme :-)) vysvětluje následující obrázek.

Alternativní syntage IF v PHP, Drupalu

Otevírací složená závorka se nahradí dvojtečkou : a uzavírací složená závorka se nahradí odpovídajícím klíčovým slovem se středníkem.

V Drupalu se s alternativním zápisem setkáte velmi často. Důvodem je především snazší a přehlednější kombinace PHP a HTML kódu. S touto formou zápisu se proto setkáme zejména v šablonách Drupal témat, s kterými se ale seznámíme až někdy jindy. Nyní alespoň pro představu:

Příklad - první způsob zápisu:

<?php
if ($day == 'Pondělí') {
  print '
  <h2>Dnes je Pondělí</h2>
  ';
}
?>

Odpovídající alternativní zápis:

<?php if ($day == 'Pondělí') : ?>
<p>Dnes je Pondělí</p>
<?php endif; ?>

Následující tabulka ukazuje přehled alternativních zápisů řídících struktur.

Příkaz Alternativní příkaz pro ukončení
if endif
switch endswitch
while endwhile
for endfor
foreach endforeach

V tabulce jsou i doposud neprobírané podmínkové příkazy jako while, for a foreach, kterým říkame cykly. Cykly vykonávají blok kódu dokud jej neukončíme příkazem nebo podmínkou. V našem tutoriálu se později blíže seznámíme pouze s cyklem foreach, se kterým se v Drupalu setkáte asi nejčastěji a slouží pouze k procházení polí a objektů.

Ternární operátor

Často se také k podmíněnému vyhodnocení výrazu používá tzv. ternární operátor. Díky němu např. nemusíme vypisovat porovnávanou proměnnou v podmínce dvakrát a zápis je kompaktnější. Jeho použití si ukážeme na příkladech:

<?php
if ($day == 'Pondělí') {
  print 'Dnes je Pondělí';
}
else {
  print 'Není Pondělí';
}
?>

Alternativní vyhodnocení pomocí ternárního operátoru:

<?php
print ($day == 'Pondělí') ? 'Dnes je Pondělí' : 'Není Pondělí';
?>

 

Copyright © 2011-2018, Squelle Group, s.r.o., Drupal web, konzultace, školení a šablonování. • Obchodní podmínkyKontakty