2012-04-06 3 views
4

При исследовании более эффективных способов использования инструкции switch я нашел этот пример stackoverflow. Я хотел сделать что-то подобное, но с изюминкой:Использование осциллографа

switch($status) 
{ 
case "a": 
case "b": 
    echo "start execute code for case a and b"; 
case "a": 
    echo "continue to execute code for case a only"; 
case "b": 
    echo "continue to execute code for case b only"; 
case "a": 
case "b": 
    echo "complete code execution for case a and b"; 
break; 
case "c": 
    echo "execute code for case c"; 
break; 
case "d": 
    echo "execute code for case d"; 
break; 
case "e": 
    echo "execute code for case e"; 
break; 
case "f": 
    echo "execute code for case f"; 
break; 
default: 
    echo "execute code for default case"; 
} 

Да, выше, очевидно, не работает так, как планировалось, потому что случай «а» будет падать, через через, пока он не попадает в break. Я просто хочу знать, есть ли способ сделать это элегантно, не повторяя слишком много кода.

+0

Это обычно называют провалом; Я не думаю, что до сих пор я видел его под названием «каскад». – NullUserException

+2

Я никогда не видел оператора switch с дублирующимися случаями. –

+0

Несколько случаев работают отлично в PHP afaik. – powerbuoy

ответ

5

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

+1

Это конечно * возможно *; OP просто должен использовать if/elseif/else. – NullUserException

+0

@NullUserException: это просто сделало вещи еще более неразборчивыми. Можно также просто придерживаться if/then/else для начала. –

+1

Вот что я имел в виду: просто используйте if/elseif/then, никаких операторов switch. – NullUserException

1

Это неправильное использование инструкции оператора.

Вы должны заменить свой переключатель на ряд утверждений if.

if($status == a || $status == b) { 
    echo "start execute code for case a and b"; 
    if(status == a) { 
     echo "continue to execute code for case a only"; 
    } 
    else { 
     echo "continue to execute code for case b only"; 
    } 
    echo "complete code execution for case a and b"; 
} 
else if ($status == c) { 
    echo "execute code for case c"; 
} 
... 
... 
else { 
    echo "execute code for default case"; 
} 
0

Поскольку Marc B сказал, что вы пытаетесь (по крайней мере, с помощью переключателя) не может быть сделано. К счастью, хороший способ удалить повторяющийся код - это определить методы, таким образом, код, общий для обоих и b, может быть вызван при необходимости.

1

Существует нет, как в Would $status может быть =a И b за исключением, если его array я KNO, что вы хотите сделать, и это мое доказать концепции

function runSwitch($status) { 

    if (in_array ("a", $status) && in_array ("b", $status)) { 
     echo "start execute code for case a and b" . PHP_EOL; 
    } 

    if (in_array ("a", $status)) { 
     echo "continue to execute code for case a only" . PHP_EOL; 
    } 

    if (in_array ("b", $status)) { 
     echo "continue to execute code for case b only" . PHP_EOL; 
    } 

    if (in_array ("c", $status)) { 
     echo "execute code for case c" . PHP_EOL; 
    } 

    if (in_array ("d", $status)) { 
     echo "execute code for case d" . PHP_EOL; 
    } 

    if (in_array ("e", $status)) { 
     echo "execute code for case e" . PHP_EOL; 
    } 

    if (in_array ("f", $status)) { 
     echo "execute code for case f" . PHP_EOL; 
    } 

    if (in_array ("c", $status) && in_array ("f", $status)) { 
     echo "continue to execute code for case c AND f only" . PHP_EOL; 
    } 

} 

Пример 1

$status = array (
     "a" 
); 

runSwitch($status); 

Выход

continue to execute code for case a only 

Пример 2

$status = array (
     "a" , "b" 
); 


runSwitch($status); 

Выход

start execute code for case a and b 
continue to execute code for case a only 
continue to execute code for case b only 

Я надеюсь, что это помогает

Благодаря

+0

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

6

Вот что я думаю, что было бы элегантное решение:

switch($status) 
{ 
case "a": 
case "b": 
    echo "start execute code for case a and b"; 
    if($status == "a") echo "continue to execute code for case a only"; 
    if($status == "b") echo "continue to execute code for case b only"; 
    echo "complete code execution for case a and b"; 
break; 
case "c": 
    echo "execute code for case c"; 
break; 
case "d": 
    echo "execute code for case d"; 
break; 
case "e": 
    echo "execute code for case e"; 
break; 
case "f": 
    echo "execute code for case f"; 
break; 
default: 
    echo "execute code for default case"; 
} 

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

+0

Не знаю, почему это не оценивается выше. Это самое простое решение, а также наиболее читаемое для будущих разработчиков кода. – Jazz

+0

Nice ... хорошо сделано – Baba

Смежные вопросы