Autor | Zpráva | ||
---|---|---|---|
MichalVlasák Profil |
#1 · Zasláno: 30. 12. 2013, 10:09:25
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 |
#3 · Zasláno: 30. 12. 2013, 10:26:54
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 |
#5 · Zasláno: 30. 12. 2013, 10:38:57
han5vk:
To nevadí, že to tam chybí, já to z toho pochopil. :) Děkuju za vysvětlení. Chápu to. :) |
||
Chro Profil |
#6 · Zasláno: 30. 12. 2013, 11:58:02
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; } |
||
Fisir Profil |
Reaguji na Chra:
A ono to nefunguje. |
||
Chro Profil |
#8 · Zasláno: 30. 12. 2013, 12:20:56
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 |
#9 · Zasláno: 30. 12. 2013, 12:28:04
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 |
#10 · Zasláno: 30. 12. 2013, 12:33:47
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 |
#11 · Zasláno: 30. 12. 2013, 12:45:22
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 |
#12 · Zasláno: 30. 12. 2013, 13:17:02
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 |
#14 · Zasláno: 30. 12. 2013, 13:36:09
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.
|
||
Časová prodleva: 10 let
|
0