| 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: 12 let
|
|||
0