PHP CASE语句不使用零值

PHP CASE语句不使用零值,php,switch-statement,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

我不明白这里发生了什么。从逻辑上讲,这对我来说毫无意义

<?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”。这对我来说毫无意义。有人能解释一下这里发生了什么吗?

大小写后的数量必须是值,而不是布尔表达式。我猜PHP正在评估
case$level>80
case($level>80)
,这将成为
case 0
(即,false,因为
$level
确实不小于80),因此您正在匹配第一个案例。

开关($level)
更改为
开关(true)
,这将起作用


语句对案例中的值执行相等性测试。PHP正在评估您的
比较,因此
case$level>80
变为
case false
false
被认为等于
0
,因此第一个大小写匹配。

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

我刚刚检查了,您必须提供一个不同的值

我想如果你能把它再写一次,比如:

$levelDivTwenty = intval($level/20);
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty;
然后再谈这个案子

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

正如其他人所指出的,您不能像那样使用switch,但如何定义它呢

<?
$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,因此将四舍五入为0

这并不是开关的实际用途。这是为了评估一个特定的值


在这里使用If/else If,而不是让你的生活复杂化,让开关像这样工作。

这对我现在来说很有意义。我对开关的工作方式有一个根本性的误解。谢谢你的教育@pbamey,是的,回答很好,我同意,所以接受它并给Phil应得的。我不确定这是否是使用switch语句的推荐方法,但我不认为它读起来很好。这是一种有趣的方法