Práce s příznaky v PHP

Nyní se naučíme pracovat s příznaky. Příznak je speciální proměnná, která může nabývat pouze dvou hodnot: true a false. Pomocí příznaků lze řešit úkoly, které ověřují nepřítomnost něčeho: lze například zkontrolovat, že v poli není prvek s určitou hodnotou. Pojďme začít.

Pojďme vyřešit následující úkol: je dáno pole s čísly, je třeba zkontrolovat, zda v něm je prvek s hodnotou 3 nebo ne. Pokud ano - vypište '+++', pokud ne - vypište '---'.

Nejprve zkusme vypsat '+++'. K tomu projdeme všechny prvky našeho pole a podmínkou se zeptáme - je aktuální prvek roven hodnotě 3. Pokud ano - vypíšeme '+++':

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++';
    }
  }
?>

Ale naše řešení není nejlepší: pokud v poli bude ne jedna hodnota 3, ale několik, pak se '+++' vypíše několikrát. Pojďme upravit naše pole (vytvořme dva prvky s hodnotou 3) a přesvědčme se o tom:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // vypíše se několikrát
    }
  }
?>

Pojďme problém opravit: ukončeme cyklus pomocí break, pokud byl prvek již nalezen:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++';
      break;  // ukončíme cyklus
    }
  }
?>

Nyní zkusme udělat to, aby, pokud v poli vůbec nejsou prvky s hodnotou 3, vypsalo '---'. Častým omylem je přidat else k naší podmínce - v tomto případě se '---' bude vypisovat pro všechny prvky, které nejsou 3:

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // vypíše se na prvku 3
    } else {
      echo '---'; // vypíše se na prvcích 1, 2, 4, 5
    }
  }
?>

Takže, nápad přidat else - je špatný nápad, nefunguje. Pro řešení úkolů tohoto druhu (takové úkoly se vyskytují dostatečně často) se používají takzvané příznaky.

Jak již bylo zmíněno výše, příznak - je taková proměnná, která může nabývat dvou hodnot: true nebo false.

Takže, pojďme vytvořit proměnnou flag s touto hodnotou: pokud je rovna true, pak v poli je prvek 3, a pokud false, pak takový prvek není.

Nejprve nastavme proměnnou flag na hodnotu false - to znamená, že budeme předpokládat, že prvek 3 v poli není:

javascript$arr = [1, 2, 3, 4, 5];
$flag = false; // předpokládáme, že prvek 3 v poli není

Poté spustíme cyklus s podmínkou tak, jak jsme to dělali dříve. Pokud cyklus zjistí, že v poli je prvek 3 - pak nastavíme proměnnou flag na hodnotu true a ukončíme cyklus pomocí break:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false; // předpokládáme, že prvek 3 v poli není
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true; // prvek existuje - přenastavíme proměnnou $flag
      break; // ukončíme cyklus
    }
  }
?>

Odpověď na otázku, zda je v poli 3 nebo ne, můžeme dát až po cyklu. A tuto odpověď již máme: po cyklu proměnná flag mohla zůstat false nebo mohla změnit svou hodnotu na true, pokud cyklus objevil v poli 3:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false;
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true;
      break;
    }
  }
  
  // zde je proměnná $flag rovna buď true, nebo false
?>

Nyní po cyklu můžeme vytvořit podmínku, která se podívá na proměnnou flag a vypíše na obrazovku '+++' nebo '---':

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false;
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true;
      break;
    }
  }
  
  if ($flag === true) {
    echo '+++';
  } else {
    echo '---';
  }
?>
Задание 1

Je dáno pole:

php<?php
  $arr = ['a', 'b', 'c', 'd', 'e'];
?>

Zkontrolujte, zda v tomto poli je prvek 'c'. Pokud ano - vypište '+++', a pokud ne - vypište '---'.

Задание 2

Napište kód, který bude kontrolovat, zda je číslo prvočíslo nebo ne. Prvočíslo je dělitelné pouze jedničkou a samo sebou, a není dělitelné jinými čísly.