Avatar billede miqe Nybegynder
03. december 2010 - 01:44 Der er 5 kommentarer og
1 løsning

0 >= 105 returnerer TRUE

Hej Eksperter

Jeg har efterhånden set mig godt og grundigt blind på følgende kodestump:

    function barimg ()
    {
        $di = 0;
        switch($di)
        {
            case ($di >= 105): $t = '0-100plus'; break;
            case ($di >= 100): $t = '0-105'; break;
            case ($di >= 90): $t = '0-100'; break;
            case ($di >= 80): $t = '0-90'; break;
            case ($di >= 70): $t = '0-80'; break;
            case ($di >= 60): $t = '0-70'; break;
            case ($di >= 50): $t = '0-60'; break;
            case ($di >= 40): $t = '0-50'; break;
            case ($di >= 30): $t = '0-40'; break;
            case ($di >= 20): $t = '0-30'; break;
            case ($di >= 10): $t = '0-20'; break;
            case ($di > 0): $t = '0-10'; break;
            default: $t = '0'; break;
        }
        return "index_".$t.".gif?";
    }

Ovenstående returnerer 'index_0-100plus.gif' når site kaldes fra iPhone Safari.
Ved kald fra andre browsere inkl. androids returneres korrekt 'index_0.gif'.
Har undersøgt cache. Ændringer i koden trænger igennem.

Jeg er decideret mystificeret omkring hvorfor Safari på iPhone får funktionen til at returnereforkert værdi. Eksemplet for oven fejler på trods af at $di sættes explicit til 0

Benytter Snoopy til at vise kildekode på iPhone Safari, hvis nogen skulle undre sig over hvordan det kan lade sig gøre.

Håber i kan hjælpe, da ovenstående efter min bedste overbevisning ikke burde give forskellige resultater afhængig af browser og i særdeleshed ikke pga. Scope.
Derfor 200 points til den der kan knække nøden for mig.
Avatar billede miqe Nybegynder
03. december 2010 - 01:46 #1
Glem ? i "index_".$t.".gif?", da dette bare har været benyttet i debug'ing øjemed.
Avatar billede ksoren Nybegynder
03. december 2010 - 06:16 #2
For mig at se:

case ($di >= 105): $t = '0-100plus'; break;

bliver til

case (false): $t = '0-100plus'; break;

bliver til

case (0): $t = '0-100plus'; break;

så den burde være god nok
Avatar billede miqe Nybegynder
03. december 2010 - 07:09 #3
Det forklarer desværre ikke hvorfor alt andet end iPhone Safari får det forventede resultat.

Desuden bør case (false) sende pointeren videre til næste case.

Det skal nævnes at for alle positive værdier af $di returneres de forventede tekster.

Har endda forsøgt med case ($di <= 0) som første case for at se om det gjorde en forskel.

$di = 102 eksekverer case nr. 2 som forventet. Følger jeg din logik vil dette også give case (false) i case nr. 1

case (0) bør ikke kunne sidestilles med case 0
Vis dette er tilfældet må der være tale om en bug, men det kan være interesant at undersøge.

I praksis har jeg løst mit problem ved helt at undgå at kalde funktionen med 0 som parameter via ternier operator, der i forvejen testede for null.

Udfordringen som beskrevet er dog stadig interessant, så points er stadig på højkant.
Avatar billede miqe Nybegynder
03. december 2010 - 07:42 #4
Jeg fandt en forklaring på Stack Overflow.
http://stackoverflow.com/questions/1800798/php-case-statement-not-working-with-zero-values

Ændrede
switch($di)
til
switch(true)
og så virkede det hele som det skulle.

Forklaringen er mao. at resultatet af de boolske sammenligninger sammenlignes med switchen. Alle switches over og under 0 sidestilles med true i denne sammenhæng og 0 med false, hvilket forklarer case (0 >= 105) på switch (0) tester false==false hvilket evaluerer til true hvorpå $t sættes lig '0-100plus'.

Rigtigt som du skriver at
case ($di >= 105): $t = '0-100plus'; break;
bliver til
case (false): $t = '0-100plus'; break;

Dette bliver dog ikke til
case (0): $t = '0-100plus'; break;
hvilket skabte lidt forvirring.

Mit switch statement vil for $di = 0 kunne omskrives til
        switch(false)
        {
            case (false): $t = '0-100plus'; break;
            case (false): $t = '0-105'; break;
            ...
            ...
            default: $t = '0'; break;
        }
hvormed første case evaluerer til true
Avatar billede miqe Nybegynder
03. december 2010 - 07:43 #5
Læg et svar ksoren
Dit indspark gav mig et lille hint om i hvilken retning jeg skulle lede, så du skal selvfølgelig have nogle points.
Avatar billede miqe Nybegynder
16. december 2010 - 08:16 #6
Mangler et svar så du kan få nogle points ksoren.
Lukker spørgsmålet imorgen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester