1. switch-case väittää merkkijonoa nollaksi:
<?php $testi = "joo-o"; switch ($testi) { case 0: echo "olen nolla"; break; case "joo-o": echo "olen merkkijono"; break; } ?>
2. is_array ei palauta yhtään mitään (edes virhettä) foreach-loopissa tyhjällä arraylla, saati edes ilmoittele mitään (E_ALL ja display_errors = On). Jos muuttujaa ei ole, tai se on NULL, sanoo is_array bool(false):
<?php $taulukko = array(); foreach ($taulukko as $taulu) { var_dump($taulu); var_dump(is_array($taulu)); } var_dump(is_array($enoleedesolemassa)); $enoleedesolemassa = NULL; var_dump(is_array($enoleedesolemassa)); ?>
Eipä tässä mitään, sain selville PHP:n manuskasta että switch käyttää löyhää vertailua, mutta mikäköhän mahtaa olla esimerkin foreach-loopin tuoma $taulu kun se on olemassa, muttei kuitenkaan NULL tai mikään muukaan...
1. Näköjään switch muuttaa vertaillessa merkkijonon myös luvuksi, ja jos merkkijonon alussa ei ole numeroita, se on lukuna muka nolla. Jos merkkijono on "1", switch ei tulkitse sitä nollaksi vaan ykköseksi. Toisaalta if-vertailussa merkkijono on tosi eli ei nolla.
2. Ei kai foreachin sisällä olevia koodirivejä suoriteta laisinkaan, jos taulukko on typötyhjä?
1. Ei se itseasiassa muuta, voit kokeilla itse seuraavaa:
eli väljä vertailu switchissä... saisivat ympätä PHP 5:n vivun jolla saisi tiukkoja vertailuja...
2. sain selville hieman postauksen jälkeen, taas olen yhtä asiaa viisaampi.
Oman kokemuksen pohjalta boolean sekoittaa hieman kuvioita. Eli 0 ja 1 ovat false/true arvoja ja paras keino lienee välttää se tilanne, että halutaan tietää onko nolla ihan numero nolla eikä false, niin on laittaa luku nolla lainausmerkkeihin eli "0". Ja ykkösellä sama juttu siis. Tai sitten vaan ===.
Ja toimii ainakin PHP 5.0.1 => versioissa hyvin eikä ole yllätyksiä tullut.
leftover kirjoitti:
1. switch-case väittää merkkijonoa nollaksi:
<?php $testi = "joo-o"; switch ($testi) { case 0: echo "olen nolla"; break; case "joo-o": echo "olen merkkijono"; break; } ?>
Oikea ratkaisu tuossa muuten on:
<?php $testi = "joo-o"; switch ($testi) { case "0": echo "olen nolla"; break; case "joo-o": echo "olen merkkijono"; break; } ?>
Eli PHP tulkitsee lähes aina tuon nollan falseksi. Kun sen vain jaksaa aina muistaa koodatessa, niin ei todellakaan tule yllätyksiä missään kohdassa. Edellisessä viestissä sitä yritin selittää, mutta en ihan onnistunut.
Samaten:
...pitäisi kirjoittaa...
...tai...
Avainsana lienevät boolean ja algebra. Näin parin kahvipannun jälkeen ainakin olen näissä ajatuksissa... :s
Aihe on jo aika vanha, joten et voi enää vastata siihen.