Switch不适用于数字比较案例

时间:2014-03-06 03:52:49

标签: php

这是我的代码。

$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时,$compScorefair。为什么没有显示low?我不明白为什么。

4 个答案:

答案 0 :(得分:2)

switch没有像那样工作。

由于$value0,这是假值。

$value <= 25true$value > 25 && $value <= 50false,因此$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 作为切换值,您可以执行此操作以在语句中包含数字比较,其中每个比较将评估为truetrue匹配/不匹配原始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,然后在所需位置添加第五个查找值(使用适当的密钥)。