Оператор переключения PHP внутри другого оператора переключения

У меня есть ситуация, когда я должен проверить две переменные GET. После проверки первого в одном операторе switch внутри оператора, вторая переменная должна быть проверена во втором операторе switch внутри первого цикла case.

Я не могу опубликовать точный код здесь, но вот пример:

<?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'];
    }
?>

Это прекрасно работает с этим примером кода, но когда я на самом деле использую эту процедуру на моем сервере, элемент управления пропускается к значению по умолчанию в операторе родительского переключателя, даже если он имеет соответствующее значение регистра.

Об ошибках не сообщается, и я не смог отладить больше, чем до этого уровня.

Я знаю, что вы хотите увидеть код, но я не могу опубликовать его здесь. По крайней мере, вы можете вести меня больше отладки.

Ответ 1

В соответствии с примерами документации PHP, возможно, если блок 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; 
                                } 
                           } 
                    } 
                } 
        } 
    } 
?>

Ответ 2

Я не вижу ошибок в коде. Я попробовал это на своей машине, и все работает отлично. Поскольку он также отлично подходит для вас, ошибка чаще всего находится где-то в другом месте.

Нет причин, по которым вложенные операторы switch не могут быть возможны, поскольку операторы switch определяются следующим образом:

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

[statement] можно заменить простой командой, например echo "test";, серией команд echo "test"; echo "test"; или другим оператором switch. Добавление фигурных скобок ничего не меняет, поскольку они просто служат для группировки серии команд, поэтому для части then можно использовать более одной команды в условных выражениях, таких как if([condition]) [then]. Вышеприведенный ответ, который на удивление имеет 18 зазоров за неправильное консультирование по добавлению фигурных скобок, ничего не меняет.

В заключение можно утверждать, что вложенные операторы switch и способ их использования в вашем примере кода верны. Ошибка в другом месте.