【问题标题】:Discrepancy in switch statement resultsswitch 语句结果的差异
【发布时间】:2010-02-16 23:29:15
【问题描述】:
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

}

通常会观察到不止一个云层,因此,在循环通过 $metarClouds[0] 时,该层的每个 $cloudCoverage 都会添加到另一个云层上。但是,如果没有云层(清除,或“CLR”),那么它应该注册为 0。它确实如此。但是,代码以某种方式返回“阴天”。

我检查了两个 switch 语句,以确保“CLR”在我期望的时候被传递,并且$cloudCoverage 在我期望的时候等于零。每次都是。而且,$skyCoverage 在返回之前仍然注册为零。

我尝试将$cloudCoverage 设置为 1-1、0/1、0.0 或其他一些方法,以确保 PHP 不会以某种方式将其视为 null 并且......不知何故......处理它不正确。如果我重写$cloudCoverage = 0.01 并通过第一个开关传递 CLR,那么一切都正确地通过第二个开关:清除。我也尝试将最后一个案例设置为case 0: 等,但仍然有相同的错误结果。

【问题讨论】:

    标签: php switch-statement


    【解决方案1】:

    让我们仔细看看如何

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

    被评估。首先让我们将 $skyCover 替换为 0

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

    现在评估案例条件

    switch ( 0 ) {
      case ( false ):
    

    因为 (bool)0===false,所以匹配
    (见http://docs.php.net/language.types.boolean#language.types.boolean.casting)。
    正如 pygorex1 所说,这不是switch/case 的工作方式。你想要一个

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

    改为。

    (编辑:在“(bool)0===false”中使用“相同运算符”=== 不是一个好的解释。switch/case 执行loose comparison,即它允许type juggling,例如在 0==false 计算结果为 TRUE)

    【讨论】:

      【解决方案2】:

      switch 语句不是这样工作的:

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

      编辑:取这个代码sn-p:

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

      $skyCoverage0 时,语句$skyCoverage &gt;= 1.00 将评估为假。因此,case ( $skyCoverage &gt;= 1.00 ) 语句的计算结果如下:case ( false ) 并且由于 0 == false 最终结果将是 Overcast

      【讨论】:

        【解决方案3】:

        我认为问题在于:

        ( $skyCoverage >= 1.00 )
        

        评估为 false 或 0,当您将其与 $skyCoverage (0) 进行比较时,会自动选择第一个。

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 2014-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多