【发布时间】: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