Autor Zpráva
MichalVlasák
Profil
Dobrý den,
začínám s PHP a vymyslel jsem si příklad, kdy do formuláře v html zadám čílo a skript v php posoudí, jestli jde o číslo kladné, záporné, nebo nulu. Vše funguje, až do chvíle, než zadám 0. Prosím, kde může být chyba? Já mám pocit, že je vše správně.
<?php
      if (isset ($_GET['OK']))
      {
        $cislo = $_GET['cislo'];
        switch ($cislo)
        {
          case ($cislo == 0) :
            echo "Jsem 0.";
            break;
          case ($cislo < 0) :
            echo "Jsem číslo záporné.";
            break;
          default :
            echo "Jsem číslo kladné.";
        }
      }
    ?>
juriad
Profil
Nemůžeš použít switch, ten vyhledává větev podle konstanty (nemůže obsahovat výraz). Použij if; pak to začne fungovat.

<?php
      if (isset ($_GET['OK']))
      {
        $cislo = $_GET['cislo'];
        if ($cislo == 0) {
            echo "Jsem 0.";
        } elseif  {
            echo "Jsem číslo záporné.";
        } else {
            echo "Jsem číslo kladné.";
        }
      }
    ?>
MichalVlasák
Profil
juriad, juriad:
Děkuji. Můžu ještě poprosit vysvětlení, proč nemohu použít switch? Já jsem to totiž pochopil tak, že switch se totiž nechá použít jako náhrada else if.
han5vk
Profil
juriad:
Chýba ti v kóde elseif ($cislo < 0) :)

MichalVlasák:
Switch sa dá použiť iba na zadané premenné, či hodnoty, teda napr. case 0... case 1... case $ineCislo... case "modry"...case "cerveny" , nie na výrazy ako case $cislo < $ineCislo (ktoré vracajú true/false). Snáď si pochopil.
MichalVlasák
Profil
han5vk:
To nevadí, že to tam chybí, já to z toho pochopil. :) Děkuju za vysvětlení. Chápu to. :)
Chro
Profil
han5vk [#4]:
Já jsem tedy u switch viděl třeba i zápis ve smyslu "když je menší nebo větší", příklad:
switch ($i)
 {
case ($i < 0):
echo 'je menší než nula';
break;
}
ale nezkoušel jsem funkčnost.
Fisir
Profil
Reaguji na Chra:
A ono to nefunguje.
Chro
Profil
Pak by měl [#1] fungovat, ne? Možná že by vstup z GET, který je vždy typu string, by měl být převeden na int nebo float.
Jan Tvrdík
Profil
Fisir, Chro:
Nefunguje to. Pro $i = 0 se to vyhodnotí jako špatně. Pro pochopení si to přepište jako if:

if ($i == ($i < 0)) { // <=> (0 == false) <=> true
    echo 'je menší než nula';
}
Chro
Profil
Já to pořád nechápu. V komentáři v manuálu k funkci switch je podobný skript jako v [#1] a zřejmě tedy bude fungovat. (vyhledejte si tam na stránce randomize)
Jan Tvrdík
Profil
Chro:
Já to pořád nechápu.
V tom případě si nastuduj základy vyhodnocování výrazů v PHP, konkrétně např. www.php.net/manual/en/types.comparisons.php.

V komentáři v manuálu k funkci switch je podobný skript jako v [#1] a zřejmě tedy bude fungovat.
Velká část komentářů na php.net obsahuje blbosti a nefunkční věci. Předpoklad, že to bude fungovat, protože je to v komentáři na php.net je tedy obecně chybný. V tomhle konkrétním případě si všimni, že generuje vždy čísla větší než nula.
Chro
Profil
Tak tohle funguje.
<?php
$a = (float) $_GET['a'];
switch ($a)
{
case ($a === 0):
echo 'rovno 0';
break;
case ($a > 0):
echo 'vetsi nez 0';
break;
default:
echo 'mensi nez 0';
}
?>
Jan Tvrdík
Profil
Chro:
Tak tohle funguje.
Ale je to megablbost. Odpovídá to

$a = (float) $_GET['a'];
if ($a == ($a === 0)) { // ($a === 0) je vždy FALSE
    echo 'rovno 0';
} elseif ($a == ($a > 0)) {
    echo 'vetsi nez 0';
} else {
    echo 'mensi nez 0';
}

Což lze výrazně přehledněji napsat jako

$a = (int) $_GET['a'];
if ($a === 0) {
    echo 'rovno 0';
} elseif ($a > 0) {
    echo 'vetsi nez 0';
} else {
    echo 'mensi nez 0';
}
Chro
Profil
Tak jasně, že to jde napsat if, elseif, else, ale MichalVlasák se divil v [#1] proč mu to nejde v konstrukci switch, to byla původní otázka.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: