PHP CASE语句不使用ZERO值

时间:2009-11-26 00:02:28

标签: php switch-statement

我不明白这里发生了什么。从逻辑上讲,它对我没有任何意义。

<?php
$level = 0;

switch ($level) {

  case $level > 80: $answer = 'high'; break;
  case $level > 60: $answer = 'moderate-to-high'; break;
  case $level > 40: $answer = 'moderate'; break;
  case $level > 20: $answer = 'low-to-moderate'; break;
  default: $answer = 'low'; break;
}   
echo $answer;
?>

当$ level == 0时,它返回“high”。这对我没有任何意义。有人能解释一下这里发生了什么吗?

5 个答案:

答案 0 :(得分:27)

switch ($level)更改为switch (true),这样就可以了。

switch语句对案例中的值执行相等测试。 PHP正在评估您的>比较,因此case $level > 80变为case falsefalse被视为等于0,因此第一种情况匹配。

答案 1 :(得分:5)

case之后的数量只需要是值,而不是布尔表达式。我猜测PHP正在评估case $level > 80case ($level > 80),它正在成为case 0(即,假,因为$level确实不小于80)所以你是匹配第一个案例。

答案 2 :(得分:1)

正如其他人指出你不能像这样使用开关,但如何定义它如下:

<?
$level = 21;
$answers = array('low', 'low-to-moderate',
                 'moderate', 'moderate-to-high', 'high');

echo $answers[intval(($level-1)/20)];
?>

注意 :如果 $ level = 0 ,那么 intval()中的表达式将是 -1/20 小于-1,因此将四舍五入为

答案 3 :(得分:1)

这并不是真正意图如何使用开关。它是为了评估特定值。

如果在这里使用If / else,而不是让你的生活变得复杂,使开关像一个一样工作。

答案 4 :(得分:0)

您确定可以在php中执行此操作吗?

我刚检查了manual of switch,你必须提供一个不同的值。

我想如果你能再把它写成:

$levelDivTwenty = intval($level/20);
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty;

然后就此而言。

switch ($levelDivTwenty) {
  case 4: //same as $level > 80 before...
  case 3: //>60 etc...
}