Вопрос по php, switch-statement – оператор переключения с двумя переменными одновременно

14

Может ли кто-нибудь предложить лучший способ получить следующий оператор switch? Я не знаю, что можно сравнивать два значения одновременно, но это было бы идеально:

switch($color,$size){
    case "blue","small":
        echo "blue and small";
    break;

    case "red","large";
        echo "red and large";
    break;
}

Это может быть сопоставимо с:

if (($color == "blue") && ($size == "small")) {
    echo "blue and small";
}
elseif (($color == "red") && ($size == "large")) {
    echo "red and large";
}

Update Я понял, что мне нужно будет отрицать($color !== "blue") и сравнивать, а не приравнивать переменные к строкам.

Какую реальную проблему вы пытаетесь решить? Jared Farrish
Ответы @Stikmou и Renaat De Muynck, представленные ниже, отлично отвечают на вопрос автора. Другие ответы, хотя и являются, конечно, законными, идут о решении немного по-другому. Aaron

Ваш Ответ

6   ответов
33

Используя новый синтаксис массива, это выглядит почти так, как вы хотите:

switch ([$color, $size]) {
    case ['blue', 'small']:
        echo 'blue and small';
    break;

    case ['red', 'large'];
        echo 'red and large';
    break;
}
1

чтобы вкладывать операторы switch:

switch($color){
    case "blue":
        switch($size):
            case "small":
            //do something
            break;
    break;
}
Я не рекомендовал использовать это, на самом деле это очень плохое чтение и не очень хорошая практика.
27

    switch(true)
    {
      case ($color == 'blue' and $size == 'small'):
        echo "blue and small";
        break;
      case ($color == 'red' and $size == 'large'):
        echo "red and large";
        break;
      default:
        echo 'nothing';
        break;
    }
ужасно некрасивый, но не "неправильный" либо ... лучше использовать стандартный if () вместо этого, если только для удобочитаемости.
Я думаю, что это идеально. Для реального мира это то, что используют настоящие разработчики.
Спасибо! Я согласен .. может запутаться, и, вероятно, будет. Я пытаюсь понять,switch может сделать заявление if более приятным и легко изменить в будущем. d-_-b
7

Найдено вhttp://www.siteduzero.com/forum/sujet/switch-a-plusieurs-variables-75351

<?php
$var1 = "variable1";
$var2 = "variable2";
$tableau = array($var1, $var2);

switch ($tableau){
    case array("variable1", "variable2"):
        echo "Le tableau correspond !";
    break;

    case array(NULL, NULL):
        echo "Le tableau ne correspond pas.";
    break; 
}
?>
0
var $var1 = "something";
var $var2 = "something_else";
switch($var1.$var2) {
case "somethingsomething_else":
    ...
    break;
case "something...":
    break;
case "......":
    break;
}
PHP, а не JavaScript.
17

switch($color . $size) {
   case 'bluesmall': ...
   case 'redlarge': ...
}

но это становится ужасно быстро.

не будет проблемой для того, что я делаю, но это хороший момент для обсуждения. В любом случае, спасибо за трюк! d-_-b
Это может сработать !! d-_-b
Просто будьте осторожны с неоднозначными значениями, которые обычно могут не совпадать, например, включить'abc' . 'def'в то время как дело'ab' . 'cdef', два разных набора значений, но с одинаковым сцепленным результатом.
«не»; строки будет просто логическим значением false. если вам нужно отрицать вещи или проверять неравенство, то переключитесь на обычную структуру if / then / else. операторы case предназначены для нескольких тестов на равенство для одного значения ядра. это объединение является просто оскорбительным продолжением этого, но вы не можете в корне изменить тот факт, что он все еще просто тест на равенство.
Может быть стоит добавить разделительный символ между строками, может быть, просто запятая или необычно используемый символ (например, труба)? пример: $ color. '', '. $ size затем сравните' blue, small '

Похожие вопросы