int = 0时的php switch语句错误

时间:2012-09-30 09:29:17

标签: php switch-statement

我在php switch case中遇到问题。

当我设置 $ number = 0 时,它应该首先运行大小写,但此处此代码返回 10-20K ,这是第二种情况

我检查了比较运算符,如果在其他情况下测试它们会返回正确的值,但是第一种情况不会在 $ number = 0

上运行

为什么会这样? php认为0为false或代码中有错误?

链接到键盘粘贴http://codepad.org/2glDh39K

这里也是代码

<?php

$number = 0;

    switch ($number) {
     case ($number <= 10000):
            echo "0-10K";
           break;
        case ($number > 10000 && $number <= 20000):
            echo "10-20K";
            break;
        case ($number > 20000 && $number <= 30000):
            echo "20-30K";
            break;
        case ($number > 30000 && $number <= 40000):
            echo "30-40K";
            break;
        case ($number > 40000 && $number <= 50000):
            echo "40-50K";
            break;
        case ($number > 50000 && $number <= 60000):
            echo "50-60K";
            break;
        case ($number > 60000 && $number <= 70000):
            echo "60-70K";
            break;
        case ($number > 70000 && $number <= 80000):
            echo "70-80K";
            break;
        case ($number > 80000 && $number <= 90000):
            echo "80-90K";
            break;
        case ($number > 90000):
            echo "90K+";
            break;

        default: //default
            echo "N/A";
            break;
}

?>

7 个答案:

答案 0 :(得分:4)

几乎反向使用switch,但并不完全。您需要通过编写switch(true)

完全反向
switch (true) { // IMPORTANT CHANGE HERE!
    case ($number <= 10000):
        echo "0-10K";
       break;
    case ($number > 10000 && $number <= 20000):
        echo "10-20K";
        break;
    // etc
}

或以其他方式将整个内容更改为if / else

if ($number <= 10000) {
    echo "0-10K";
else if ($number > 10000 && $number <= 20000) {
    echo "10-20K";
}
// etc

两个重要的注释:

  1. 第一次看到它时,反向switch通常看起来非常反直觉。如果您觉得不舒服,请不要使用它。
  2. 您的条件可以简化 - 假设它们按顺序出现,每个$number > X部分由于前一个条件($number <= X)中的检查已经失败而变得多余。但是,可以认为保持检查会使代码在修改时更加健壮。

答案 1 :(得分:4)

switch ($number) {
 case ($number <= 10000):   // check $number == ($number <= 10000)
       echo "0-10K";
       break;
 // you hit the below because `0 == false` is true in php
 case ($number > 10000 && $number <= 20000): // check $number == ($number > 10000 && $number <= 20000)
        echo "10-20K";
        break;
 // ...

但你可以用更少的代码来做到这一点:

function showRange($number) {
    if ($number > 90000) {
       echo "90K+";
       return;
    }
    echo sprintf("%s-%sK", (int) ($number / 10000) * 10, ((int) ($number / 10000) +1) * 10 );
}

答案 2 :(得分:3)

$number = 0;
var_dump($number); // int(0)

如果您将语句修改为case ($number > 0 && $number <= 10000):,那就奇怪了。但它适用于输入的任意查找($number > 9091 && $number <= 10000)。

即使下面有完整的bollock:

$number = 0;
$jonskeet = false;

switch ($number)
{
    case ($jonskeet === true && $number <= 10000):
        echo "0-10K";
        // ...

即使0-10K语句中的相同条件无法正常工作,也会输出if

问题是select不适用于长条件。如果变量的值等于 select关键字之后的内容,case可用于执行某些操作。参见:

select ($user_rank)
{
    case 0:
        return "guest";
        break;
    case 1:
        return "user";
        break;
    // ...
    default:
        return "unknown";
        break;
}

但是你的代码case中的条件很长。

case ($number <= 10000):
    echo "0-10K";
    break;
case ($number > 10000 && $number <= 20000):
    echo "10-20K";
    break;

首先将$number <= 10000转换为 TRUE ,将$number > 10000 && $number <= 20000转换为 FALSE ,就像两个语句一样。在此之后,您的代码将按以下方式执行:

case TRUE:
    echo "0-10K";
    break;
case FALSE:
    echo "10-20K";
    break;

$number0,但它也可以评估为FALSE,这就是为什么你得到了不理想的输出。

作为解决方案,您应该将代码翻译为if - elseif - else设置:

 if ( $number < 10000 ) {
     echo "0-10K";
 } else if ( $number > 10000 && $number <= 20000 ) {
     echo "10-20K";
 // ...
 } else {
     echo "N/A";
 }

答案 3 :(得分:2)

执行switch case方法时,无法匹配类似的布尔值。您只需要比较结果值。

我认为您应该重写代码以使用if...then...elseif语句。

if ($number <= 10000){
  echo "0-10K";
}elseif($number <= 20000){
  echo "10-20K";
}elseif($number <= 30000){
  echo "20-30K";
}elseif($number <= 40000){
  ...
}

通过使用此方法,您不需要每次都进行两次检查,因为之前的if语句也会检查这些条件。 IE:如果您达到第二个if语句,您已经知道该值小于(或等于)1000因此必须大于10000

答案 4 :(得分:1)

这里,如果$ i等于0,PHP将执行所有的echo语句!

所以它执行下一个案例的陈述,在那种情况下,它就会从中断开

所以使用if-else-if而不是switch case

if ($number <= 10000){
  echo "0-10K";
}elseif(  $number <= 20000){
  echo "10-20K";
}elseif(  $number <= 30000){
  echo "20-30K";
}elseif(  $number <= 40000){
  echo "90K+";
}

 ...

elseif(  $number <= 90000)
     echo "80-90K";

}elseif($number > 90000){
echo "90K+";
}

答案 5 :(得分:1)

是的,因为PHP 0FALSE(除非您使用===)。是的,您的代码不正确 - switch不是用于比较范围 - 它用于比较值(至少在PHP中,在Ruby中或在Perl 6中是另一个问题),就像那里一样。

switch ($letter) {
case 'a':
    echo "A?";
    break;
default:
    echo "Unknown letter";
    break;
}

在您的情况下,您将数字与条件进行比较 - 这些条件会返回truefalse。当0false时,第二个条件就会捕获。 switch不适用于此类代码,我会使用if else代替或重写您的逻辑 - 重复不是好主意。

$range_number = floor($number / 1000);
echo $range_number, $range_number ? "K" : "", "-", $range_number + 1, "K";

(顺便说一句,我知道switch (true)有效,但不要使用它 - 这是丑陋的黑客攻击)

答案 6 :(得分:0)

您无法为一系列号码切换案例。请使用if(){} else {}用于此目的。