在Case上有多个条件时,Switch Statment无法正常工作

时间:2018-02-05 16:45:37

标签: php switch-statement

$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 ,我做错了什么?

2 个答案:

答案 0 :(得分:1)

尝试并假设开关将吐出布尔值可能是直观的,然后您可以为您的案例添加其他布尔逻辑。然而,这是错误的。

来自开关上的PHP文档:

  

这就是它的工作原理:首先我们有一个表达式n(最常见的是   变量),评估一次。表达式的值是   然后与结构中每个案例的值进行比较。

你的每个案例都需要与评估的`$ letter $表达式完全匹配,你不能有其他的布尔表达式和其他情况。

答案 1 :(得分:1)

根据您的代码,g案例将始终评估为true

var_dump('g' && ((5==5) || (3==3 || 4==4))); // true

switch个案例使用宽松比较,$letterg时,会使用true进行评估。由于g是loosley true,因此会执行该案例:

var_dump('g' == true);  // true
var_dump('g' == false); // false

你可能需要这个:

        case 'g':
            if(($z || $y)) { echo "g"; }
                break;