Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Mielenkiintoisia havaintoja...

leftover [06.01.2005 18:48:15]

#

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...

Antti Laaksonen [06.01.2005 19:46:49]

#

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ä?

leftover [06.01.2005 21:13:38]

#

1. Ei se itseasiassa muuta, voit kokeilla itse seuraavaa:

<?php
if ("joo-o" == 0) {
    echo "olen ihan oikeasti nolla!";
}
?>

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.

Wizard [07.01.2005 14:07:12]

#

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.

Wizard [09.01.2005 01:19:16]

#

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:

if ("joo-o" == 0) {
    echo "olen ihan oikeasti nolla!";
}

...pitäisi kirjoittaa...

if ("joo-o" == "0") {
    echo "olen ihan oikeasti nolla!";
}

...tai...

if ("joo-o" === 0) {
    echo "olen ihan oikeasti nolla!";
}

Avainsana lienevät boolean ja algebra. Näin parin kahvipannun jälkeen ainakin olen näissä ajatuksissa... :s

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta