Оператор переключения PHP внутри другого оператора переключения - PullRequest
12 голосов
/ 20 февраля 2012

У меня такая ситуация, когда мне нужно проверить две переменные 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'];
    }
?>

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

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

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

Ответы [ 2 ]

34 голосов
/ 08 июля 2014

В соответствии с примерами документации 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 голосов
/ 08 ноября 2016

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

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

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

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

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

...