Switch deyimi sonuçları Çelişkisi

3 Cevap php

fonksiyonu 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

}

Tipik olarak, birden fazla bulut tabakası görülmektedir ve $metarClouds[0] döngü sırasında, bu nedenle, her bir $cloudCoverage katmanında diğer üzerine ilave edilir. Hiçbir bulut tabakası (açık veya "CLR") söz konusu ise, o zaman 0 olarak kayıt olmanız gerekmektedir. Ve öyle. Ancak, kod nasılsa "Bulutlu" döndürür.

Ben o beklediğiniz "CLR" geçirilen sağlamak için her iki switch ifadeleri kontrol ettik, ve ben beklediğiniz zaman o $cloudCoverage sıfıra özdeştir. Bu, her zaman. Ve, $skyCoverage hala dönmeden önce sıfır olarak kaydeder.

PHP nasılsa nasılsa ... yanlış işleme gibi boş ve ... onu tedavi olmadığından emin olmak için $cloudCoverage 1-1, 0/1, 0.0, veya başka bir yöntemle ayarı denedim. Ben böylece $cloudCoverage = 0.01 yeniden yazmak ve ilk anahtarı aracılığıyla CLR geçerseniz, her şeyi doğru ikinci anahtarı aracılığıyla geliyor: Temizle. Ben de case 0: vb son davayı ayarlama denedim, ama yine aynı hatalı sonuç var ettik.

3 Cevap

Kullanıcının daha yakından bir göz atalım nasıl

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

değerlendirilir. 0 First diyelim yerine $ Skycover

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

Şimdi vaka durumunu değerlendirmek

switch ( 0 ) {
  case ( false ):

And since (bool)0===false, it's a match
(see http://docs.php.net/language.types.boolean#language.types.boolean.casting).
As pygorex1 said that's not the way switch/case works. You want an

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

yerine.

(Edit: "özdeş operatörü" === in "(bool) 0 === false" kullanarak iyi bir açıklama değildir anahtarı / olgu loose comparison, yani olanak {[(1 gerçekleştirir. )]}, TRUE değerlendiren 0 == false) gibi

İşte switch ifadeleri nasıl çalışır değil:

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

Düzenleme: Bu kod parçacığını alır:

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

$skyCoverage 0 ifadesi olduğunda {[(2)] false} değerlendirecek. case ( false ) beri 0 == false sonuç olacaktır Overcast: Yani, case ( $skyCoverage >= 1.00 ) deyimi bu kadar değerlendirilir

Ben sorun olduğunu düşünüyorum:

( $skyCoverage >= 1.00 )

yanlış veya 0 olarak değerlendirir ve $ skyCoverage ile karşılaştırarak konum olarak (0), ilk otomatik olarak seçilir.