$letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
$x = (1==1 || 2==2);
$y = (3==3 || 4==4);
$z = (5==5);
foreach ($letters as $key => $letter) {
switch ($letter) {
case 'a':
echo "a";
break;
case 'b':
echo "b";
break;
case 'c':
echo "c";
break;
case 'd':
echo "d";
break;
case 'e':
echo "e";
break;
case 'f':
echo "f";
break;
case 'g' && ($z || $y):
echo "g";
break;
case 'h' && ($x):
echo "h";
break;
}
}
我不知道为什么,但在最后两种情况下' 和' h' 它没有正常工作并获得双重' ,我期望的结果是
abcdefgh 但我一直在 abcdefgg ,我做错了什么?
答案 0 :(得分:1)
尝试并假设开关将吐出布尔值可能是直观的,然后您可以为您的案例添加其他布尔逻辑。然而,这是错误的。
来自开关上的PHP文档:
这就是它的工作原理:首先我们有一个表达式n(最常见的是 变量),评估一次。表达式的值是 然后与结构中每个案例的值进行比较。
你的每个案例都需要与评估的`$ letter $表达式完全匹配,你不能有其他的布尔表达式和其他情况。
答案 1 :(得分:1)
根据您的代码,g
案例将始终评估为true
:
var_dump('g' && ((5==5) || (3==3 || 4==4))); // true
switch
个案例使用宽松比较,$letter
为g
时,会使用true
进行评估。由于g
是loosley true
,因此会执行该案例:
var_dump('g' == true); // true
var_dump('g' == false); // false
你可能需要这个:
case 'g':
if(($z || $y)) { echo "g"; }
break;