代码之家  ›  专栏  ›  技术社区  ›  pbarney

php case语句不使用零值

  •  6
  • pbarney  · 技术社区  · 15 年前

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

    <?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 回复  |  直到 13 年前
        1
  •  27
  •   Phil Ross Matt Johnson-Pint    15 年前

    变化 switch ($level) switch (true) 这样就行了。

    switch 语句对事例中的值执行相等测试。PHP正在评估 > 比较,所以 case $level > 80 变成 case false . false 被认为等于 0 ,所以第一个案例匹配。

        2
  •  5
  •   James Cronen    15 年前

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

        3
  •  1
  •   Maiku Mori    15 年前

    正如其他人指出的,你不能使用 转换 像那样,但是像这样定义它如何:

    <?
    $level = 21;
    $answers = array('low', 'low-to-moderate',
                     'moderate', 'moderate-to-high', 'high');
    
    echo $answers[intval(($level-1)/20)];
    ?>
    

    注释 如果 $level=0 ,然后表达式在内部 英特尔() - 1/20 ,请 小于-1,因此将四舍五入为0 .

        4
  •  1
  •   MattBelanger    15 年前

    这并不是开关的真正用途。它是对特定值的评估。

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

        5
  •  0
  •   Dimitrios Mistriotis    15 年前

    您确定可以在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...
    }