以下示例是http://php.net/manual/de/control-structures.switch.php
的摘要<?php
$totaltime = 0;
switch ($totaltime) {
case ($totaltime < 1):
echo "That was fast!";
break;
case ($totaltime > 1):
echo "Not fast!";
break;
case ($totaltime > 10):
echo "That's slooooow";
break;
}
?>
我预计结果为“那很快”。但实际结果是“不快!”。如果有人可以解释我为什么会这么好吗?
但如果我添加另一个案例,case 0: echo "That was super fast!".
那么它就会正确回应。即“那太快了!”。请帮我看看如何使用条件切换语句。
编辑: -
感谢大家的回复。我能够通过modifyong开关($ totaltime)来切换(1)
来克服上述问题答案 0 :(得分:10)
case ($totaltime < 1):
表示1
到PHP(该等式返回true)
case ($totaltime > 1):
表示0
到PHP(该等式返回false)
由于$totaltime
为0,您将获得该输出
换句话说,PHP将$totaltime
与比较结果进行比较。
关于OP中编辑的编辑:
你需要摆脱switch()
- 陈述。您只能使用它轻松地与不同的值进行比较,而不使用其他表达式。
我的意思是
出了什么问题<?php
$totaltime = 0;
if ($totaltime < 1) {
echo "That was fast!";
} else if ($totaltime > 10) {
echo "That's slooooow";
} else if ($totaltime > 1) {
echo "Not fast!";
}
?>
编辑:请注意我切换了最后两个if语句以使其真正起作用。
答案 1 :(得分:2)
你不会在case
语句中使用这样的条件,不管怎么说都不直观。这就是发生的事情:
case ($totaltime < 1): // Evaluates to 1. $totaltime is not 1, so no match.
case ($totaltime > 1): // Evaluates to 0. $totaltime is 0, so match.
基本上,您尝试将else if
构造用作switch
构造,但功能不存在。条件不会以您期望的方式(它们在if
块中的方式)进行评估,它们只是在寻找第一个case
块,它等于在switch
阻止。
答案 2 :(得分:2)
讨厌一个已经回答的帖子,但我感到困惑,没有人触及开关(true)方法。
两种方法都没有现实世界的速度优势
在某些情况下,开关更快,其他情况下if更快,但只有几分之一微秒 (48.16μs与49.11μs的切换速度比如果更快)。
修改的
现在我看到OP做了同样的事情......
<?php
for ( $totaltime = 0; $totaltime < 11; $totaltime += 0.5 ) {
switch ( true ) {
case ( $totaltime < 1 ):
echo $totaltime . " That was fast!\n";
break;
case ( $totaltime < 10 ):
echo $totaltime . " Not fast!\n";
break;
default:
echo $totaltime . " That's slooooow\n";
break;
}
}
0 That was fast!
0.5 That was fast!
1 Not fast!
1.5 Not fast!
2 Not fast!
2.5 Not fast!
3 Not fast!
3.5 Not fast!
4 Not fast!
4.5 Not fast!
5 Not fast!
5.5 Not fast!
6 Not fast!
6.5 Not fast!
7 Not fast!
7.5 Not fast!
8 Not fast!
8.5 Not fast!
9 Not fast!
9.5 Not fast!
10 That's slooooow
10.5 That's slooooow
答案 3 :(得分:1)
这似乎是一个波浪转换问题。
第一个case语句将计算为0以外的任何值,因此不会命中。
但是第二个case语句将评估为false,它应该是0,等于你将$ totaltime设置为。
答案 4 :(得分:1)
幸运的是,
PHP开关与一系列IF语句相同。案例评估为:
if($totaltime == ($totaltime < 1)) {
echo "That was fast!";
break;
}
if($totaltime == ($totaltime > 1)) {
echo "Not fast!";
break;
}
...
显然,第二个IF的0 == false为真,因此结果为。
谢谢, 维卡斯。
答案 5 :(得分:0)
其他人已经提到为什么会发生这种情况(在案件陈述中滥用条件),但他们没有提供替代方案。 Switch旨在涵盖特定的参数,如{0,1,2,3..100,101}等。它分离出特定的参数或范围,而不是执行简单的if / else(就像你使用它一样)。您可以重写您的参数以将其拉下来:
switch ($totaltime) {
case (0):
echo "That was fast!";
break;
case (1..PHP_INT_MAX):
echo "Not fast!";
break;
default:
echo "That's slooooow";
break;
}
这里..允许覆盖范围,因此该情况涵盖从1到整数最大值的任何内容。 0是明确处理的,所有其他的(re:&lt; 0)都由默认情况覆盖。