这是我的代码。
$value = 0;
switch($value) {
case ( $value <= 25 ):
$CompScore = 'low';
break;
case ($value > 25 && $value <= 50 ):
$CompScore = 'fair';
break;
case ($value > 50 && $value <= 75 ):
$CompScore = 'good';
break;
case ($value >75 ):
$CompScore = 'excellent';
break;
default:
$CompScore = 'low';
break;
}
echo $CompScore;
当值为0
时,$compScore
为fair
。为什么没有显示low
?我不明白为什么。
答案 0 :(得分:2)
switch
没有像那样工作。
由于$value
是0
,这是假值。
$value <= 25
为true
,$value > 25 && $value <= 50
为false
,因此$CompScore
为'fair'
。
对于您的代码,使用if elseif else
流程将更具可读性。
您可以像下面那样重写代码:
// from excellent to low
if ($value > 75) {
$CompScore = 'excellent';
} else if ($value > 50) {
$CompScore = 'good';
} else if ($value > 25) {
$CompScore = 'fair';
} else {
$CompScore = 'low';
}
答案 1 :(得分:1)
问题是,你以特定的方式使用你的开关。
你在说:
$value = 0;
Switch ($value){
case ($value < 25):
....
}
这最终将$ value&lt; 25和0进行比较,如下所述:
($value<25) == $value.
=> true == 0
这是错误的,因为true != 0
以这种方式执行您想要的操作只是将switch($value)
替换为switch(true)
,以便解释器实际比较检查您的case语句是否为真。
答案 2 :(得分:0)
传递给switch语句的值基本上是switch语句查找评估匹配的值,从案例列表的顶部到底部向下,直到找到等于的值为(松散的比较),例如true == true
。
在您的示例中,您的comparisons被评估为布尔值(true或false) - 您的变量$value
设置为零,等于到{{1} },但不是相同(严格比较)false
。例如:
false
因此,通过使用布尔值(0 == false) // true
(0 === false) // false
(1 == false) // false
(1 === false) // false
(1 == true) // true
(1 === true) // false
(true === true) // true
作为切换值,您可以执行此操作以在语句中包含数字比较,其中每个比较将评估为true
或true
匹配/不匹配原始false
值(布尔值 - 布尔值比较)。
true
答案 3 :(得分:0)
您可以使用查找数组和一些简单的数学方法来“简化”代码。
代码:(Demo)
$lookup = [
1 => 'low',
2 => 'fair',
3 => 'good',
4 => 'excellent'
];
for ($i = -1; $i <= 101; ++$i) {
echo "\n$i : " , $lookup[ceil($i / 25)] ?? $lookup[1];
}
通过将值除以25,然后四舍五入到下一个整数(使用ceil()
),就可以实现相同的结果,而无需使用一系列条件语句。使用查找功能不仅可以使代码紧凑,还可以确保您不对同一值执行 n 检查,并且可以在进程和值之间进行清晰的分隔。
如果您决定将组除以20(而不是25),则只需将25
更改为20
,然后在所需位置添加第五个查找值(使用适当的密钥)。