可以对案例进行逻辑控制吗?
即:
$v = 0;
$s = 1;
switch($v)
{
case $s < $v:
// Do some operation
break;
case $s > $v:
// Do some other operation
break;
}
有没有办法做类似的事情?
答案 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";
}