【问题标题】:Switch Statment doesn't work properly with multiple conditions on CaseSwitch 语句在 Case 上的多个条件下无法正常工作
【发布时间】:2018-02-05 16:45:37
【问题描述】:
$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;
        }
}

我不知道为什么,但在最后两种情况下 'g''h' 它不能正常工作并得到双 'g',我期望的结果是

abcdefgh 但我一直收到 abcdefgg,我做错了什么?

【问题讨论】:

  • case 'g' && ($z || $y):不会工作
  • $x = (1==1 || 2==2) 有什么意义?
  • switch ($foo): case 'bar': 转换为 if ($foo == 'bar')... 应该很明显为什么 case 'g' 不起作用。
  • @UlrichEckhardt 只是原始代码的一个示例。此值和原始值或任何值都给出相同的值。
  • 好吧,如果不需要演示任何东西,那就把这些东西放在一边!你应该提供一个最小的例子来保持这里问题的质量,添加干扰项也无济于事。

标签: php switch-statement


【解决方案1】:

给定您的代码,g 案例将始终评估为 true

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

switch case 使用松散比较,当$letterg 时,它将使用true 进行评估。由于 g 是 loosley true 它会执行这种情况:

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

你可能需要这个:

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

【讨论】:

    【解决方案2】:

    尝试假设 switch 会输出布尔值可能很直观,然后您可以将其他布尔逻辑附加到您的案例中。然而,这是错误的。

    来自开关上的 PHP 文档:

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

    您的每个案例都需要与评估的 `$letter$ 表达式完全匹配,您不能有额外的布尔表达式以及案例中的任何其他内容。

    【讨论】:

    • 我认为switch($a) case $b && ($c || $d):if ($a && ($c || $d))
    • 当然不是。您刚刚发布的内容在逻辑上也不合理。
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2022-07-16
    • 2018-09-10
    • 2016-11-23
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多