4

我在 php 开关盒中遇到问题。

当我设置$number=0它应该运行第一种情况,但这里代码返回10-20K,即第二种情况。

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

为什么会这样?php 将 0 视为错误或代码中有问题?

链接到键盘粘贴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;
}

?>
4

7 回答 7

6

几乎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) 中的检查已经失败。但是,可以说保持检查使代码在面对修改时更加健壮。
于 2012-09-30T09:38:18.843 回答
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 );
}
于 2012-09-30T09:38:48.030 回答
3

当您执行 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

于 2012-09-30T09:35:55.680 回答
3
$number = 0;
var_dump($number); // int(0)

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

即使下面是完整的废话:

$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 <= 10000TRUEFALSE,就像两个语句一样。在此之后,您的代码将以下列方式执行:$number > 10000 && $number <= 20000

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";
 }
于 2012-09-30T09:45:55.180 回答
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+";
}
于 2012-09-30T09:39:52.057 回答
1

是的,对于 PHP0来说是FALSE(除非你使用===)。是的,您的代码不正确 -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)有效,但不要使用它 - 这是丑陋的黑客)

于 2012-09-30T09:41:01.743 回答
0

你不能真正为一个数字范围做 switch case。为此目的使用 if(){} else{}。

于 2012-09-30T09:42:52.900 回答