条件开关的问题

时间:2010-12-21 11:28:16

标签: php switch-statement

以下示例是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)

来克服上述问题

6 个答案:

答案 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;
    }
}

结果:https://3v4l.org/d71lZ

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)都由默认情况覆盖。