在另一个switch语句中使用PHP switch语句

16

我遇到了这样的情况,需要检查两个GET变量。在语句内的第一个switch语句中检查第一个变量后,在第一个case循环内的第二个switch语句中必须检查第二个变量。

我不能在此处发布确切的代码,但以下是一个示例:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    switch($_GET['parent']){
        case 'child1':
            if(!isset($_GET['child'])){
                echo "Only parent";
            }
            else{
                switch($_GET['child']){
                    case 'test':
                        echo 'test';
                        break;
                }
            }
            break;

        case 'child2':
            echo 'child2';
            break;

        default:
            echo $_GET['parent'];
    }
?>

这个代码示例运行良好,但是当我在服务器上实际使用此过程时,控件被跳转到父 switch 语句的默认情况,即使它具有匹配的 case 值。

没有报告错误,并且我无法调试到更深的级别。

我知道你想看看代码,但我不能在这里发布它。至少你可以指导我如何进行更多的调试。


我看不到父级开关的default情况。你的输出结果是什么? - Michael Berkowski
好的,我这里没有添加默认值,但是已经添加到真正的问题中了。 - pahnin
请在输入时发布URL,该脚本正在失败。它应该可以很好地解析example.com?parent=child1 - Michael Berkowski
我似乎无法复制这个问题:http://codepad.org/uoYT3WXS 请尝试编辑 codepad 的示例以复制您的问题。 - jk.
2个回答

44
根据PHP Documentation Examples,如果包含嵌套switch的case块用大括号括起来,则可能会出现这种情况。
请参考所提到的示例
<?php 
    switch ($argc) { 
        case 'home': { 
             print('This is $argc, home case.'); 
            break; 
        } 
        case 'subsection': { 
                switch ($argd) { 
                     case 'links': { 
                            switch($arge) { 
                                case 'display': { 
                                print('This is $arge, subsection,links,display case.'); 
                                break; 
                                } 
                           } 
                    } 
                } 
        } 
    } 
?>

你知道为什么这个例子在文档中被踩了吗? - gillespieza
一个快速的测试表明,您需要打破主开关语句以及嵌套开关语句。 - Patrick

4

我在你的代码中没有发现任何错误。我在我的机器上尝试了一下,它运行得很好。既然它对你也有效,那么错误肯定是别的地方。

嵌套 switch 语句理论上没有问题,因为 switch 语句的定义如下:

switch($variable) {
  case "case1":
    [statement]
    break;
}

[statement] 可以被一个简单的命令所替代,比如 echo "test";,一系列命令 echo "test"; echo "test"; 或者另一个 switch 语句。添加大括号不会改变任何东西,因为它们只是用来分组一系列命令的 - 这样就可以在条件语句中使用多个命令作为 then 部分,例如 if([condition]) [then]。上面的答案错误地建议你添加大括号,但却有18个赞,这并没有改变任何东西。

总之,嵌套的 switch 语句是可行的,你在代码示例中使用它们的方式是正确的。错误出现在其他地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接