PHP开关和案例逻辑控制

时间:2011-10-17 10:51:41

标签: php switch-statement

可以对案例进行逻辑控制吗?

即:

$v = 0;
$s = 1;

switch($v)
{
    case $s < $v:
        // Do some operation
        break;
    case $s > $v:
        // Do some other operation
        break;
}

有没有办法做类似的事情?

4 个答案:

答案 0 :(得分:5)

传递给switch的条件是与案例进行比较的值。条件(在你的问题$ v中)被评估一次,然后PHP寻找与结果匹配的第一个案例。

From the manual(在例2之后),重点补充:

  

switch语句逐行执行(实际上是逐个语句)。一开始,没有代码被执行。 只有当找到的case语句的值与switch表达式的值相匹配时,PHP才会开始执行语句。 PHP继续执行语句,直到switch块结束,或者第一次看到break语句。

在您的问题中switch ($v)与您撰写的内容相同:switch (0),因为$v = 0。然后,您的开关将尝试查找等于0的大小写。并且,就像@Kris said

  

$ s&lt; $ v的计算结果为false,它在$ v上触发,因为它在这里为0。


如果你必须在case语句中使用条件,你的switch条件应该是一个布尔值,例如:

$v = 0;
$s = 1;

switch (true) {
    case ($s < $v):
        echo 's is smaller than v';
    break;

    case ($s > $v):
        echo 's is bigger than v';
    break;
}

现在,您的交换机会尝试寻找第一个评估为true的案例,在本例中为$s > $v


请注意,虽然仅对开关条件进行一次评估,但每个案例都按顺序进行评估:

$a = 1;

switch ($a) {
    case 2:
        echo 'two';
        break;
    case (++$a > 2):
        break;
    default:
        echo $a;
}

从默认情况下回显'2',因为当将$ a与“2”$ a进行比较时,$ a为1且该情况被丢弃;而:

$a = 1;

switch ($a) {
    case (++$a > 2):
        break;
    case 2:
        echo 'two';
        break;

    default:
        echo $a;
}

从案例'2'回复'两个'因为++$a > 2增加$ a但与$ a不匹配。

default是一个后备,其位置无关紧要。

注意:前面提到的开关很脏,很深奥,仅作为示例提供。

答案 1 :(得分:2)

这不起作用,每个案例都需要是一个标量值。在你的例子情况下更糟糕的是,它似乎可以工作但是......

$ s&lt; $ v的计算结果为false,它在$ v上触发,因为它在这里为0。

答案 2 :(得分:1)

不是最易读的用法,但是你可以。

如果你只需要一个简单的比较,请使用if / else - if / elseif / else结构。

答案 3 :(得分:-2)

http://php.net/manual/en/control-structures.elseif.php

if ($a > $b) {
    echo "a is bigger than b";
} elseif ($a == $b) {
    echo "a is equal to b";
} else {
    echo "a is smaller than b";
}