我在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;
}
?>
答案 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
两个重要的注释:
switch
通常看起来非常反直觉。如果您觉得不舒服,请不要使用它。$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;
$number
是0
,但它也可以评估为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 0
是FALSE
(除非您使用===
)。是的,您的代码不正确 - switch
不是用于比较范围 - 它用于比较值(至少在PHP中,在Ruby中或在Perl 6中是另一个问题),就像那里一样。
switch ($letter) {
case 'a':
echo "A?";
break;
default:
echo "Unknown letter";
break;
}
在您的情况下,您将数字与条件进行比较 - 这些条件会返回true
或false
。当0
为false
时,第二个条件就会捕获。 switch
不适用于此类代码,我会使用if
else
代替或重写您的逻辑 - 重复不是好主意。
$range_number = floor($number / 1000);
echo $range_number, $range_number ? "K" : "", "-", $range_number + 1, "K";
(顺便说一句,我知道switch (true)
有效,但不要使用它 - 这是丑陋的黑客攻击)
答案 6 :(得分:0)
您无法为一系列号码切换案例。请使用if(){} else {}用于此目的。