2010-02-16 5 views
0
function skyCoverage($metarClouds) { 

    foreach($metarClouds[0] as $cloudReport) { 
     $coverageCode = substr($cloudReport, 0, 3); 

     // I check $coverageCode here, and it is indeed "CLR" 

      switch($coverageCode) { 
       case "CLR": 
        $cloudCoverage = 0; 
        break; 
       case "FEW": 
        $cloudCoverage = 1/8; 
        break; 
       case "SCT": 
        $cloudCoverage = 3/8; 
        break; 
       case "BKN": 
        $cloudCoverage = 5/8; 
        break; 
       case "OVC": 
        $cloudCoverage = 8/8; 
        break; 
      } 
    $skyCoverage = $skyCoverage + $cloudCoverage; 
    } 

// I check $skyCoverage here, and it is indeed 0 

    switch ($skyCoverage) { 
     case ($skyCoverage >= 1.00): 
       $skyCondition = "Overcast"; 
       // I do an echo $skyCoverage; here, and it actually spits out 0 still, even though it obviously shouldn't do anything at all 
       break; 
     case ($skyCoverage >= 0.75): 
       $skyCondition = "Cloudy"; 
       break; 
     case ($skyCoverage >= 0.625): 
       $skyCondition = "Mostly Cloudy"; 
       break; 
     case ($skyCoverage >= 0.5): 
       $skyCondition = "Scattered Clouds"; 
       break; 
     case ($skyCoverage >= 0.375): 
       $skyCondition = "Partly Cloudy"; 
       break; 
     case ($skyCoverage >= 0.125): 
       $skyCondition = "Mostly Clear"; 
       break; 
     case ($skyCoverage < 0.125): 
       $skyCondition = "Clear"; 
       break; 
    } 

// $skyCoverage is still zero here 

return $skyCondition; 
// Somehow $skyCondition is "Overcast" with $skyCoverage = 0 

}Divergence instruction switch résultats

En règle générale, plus d'une couche de nuages ​​est observée et, par conséquent, chaque $cloudCoverage à la couche est ajoutée sur l'autre en boucle à travers $metarClouds[0]. Cependant, s'il n'y a pas de couche de nuages ​​(clear, ou "CLR"), alors il devrait s'inscrire comme 0. Et c'est le cas. Cependant, le code renvoie en quelque sorte "Overcast".

J'ai vérifié les deux instructions de commutateur pour m'assurer que "CLR" est passé quand je m'attends à ce qu'il est, et que $cloudCoverage équivaut à zéro quand je m'attends. C'est, à chaque fois. Et, $skyCoverage enregistre toujours comme zéro juste avant le retour.

J'ai essayé de mettre $cloudCoverage à 1-1, 0/1, 0.0, ou une autre méthode pour s'assurer que PHP ne le traite pas comme null et ... en quelque sorte ... le traiter de manière incorrecte. Si je réécris de sorte que $cloudCoverage = 0.01 et passer CLR par le biais du premier commutateur, tout passe par le deuxième commutateur correctement: Effacer. J'ai également essayé de placer le dernier cas à case 0: etc., mais ai toujours le même résultat erroné.

Répondre

2

Jetons un coup d'oeil de plus près comment

switch ($skyCoverage) { 
    case ($skyCoverage >= 1.00): 

est évaluée. substitut de premier LET Skycover de $ par 0

switch (0) { 
    case (0 >= 1.00): 

évaluer maintenant le cas condition

switch (0) { 
    case (false): 

Et depuis (bool) 0 === faux, il est un match
(voir http://docs.php.net/language.types.boolean#language.types.boolean.casting).
Comme pygorex1 a dit que ce n'est pas la façon dont switch/case fonctionne. Vous voulez un

if (...) { 
} 
else if (...) { 
} 
else { 
} 

à la place.

(edit:. En utilisant l'opérateur "identique" === in "(bool) 0 === false" n'est pas une bonne explication switch/case effectue un loose comparison, ce qu'il permet type juggling, comme dans 0 = = false qui sera évalué à TRUE)

1

Ce n'est pas comment switch déclarations travail:

http://us.php.net/manual/en/control-structures.switch.php

Edit: prenez cet extrait de code:

switch ($skyCoverage) { 
    case ($skyCoverage >= 1.00): 
      $skyCondition = "Overcast"; 

Lorsque $skyCoverage est 0 la déclaration $skyCoverage >= 1.00 évaluera false. Ainsi, la déclaration case ($skyCoverage >= 1.00) est évaluée comme ceci: case (false) et depuis 0 == false le résultat final sera Overcast

0

Je pense que le problème est que:

($skyCoverage >= 1.00) 

false ou évalue 0 et que vous comparez avec skyCoverage $ (0), le premier est automatiquement sélectionné .

Questions connexes