【问题标题】:switch statement with two variables at a time一次带有两个变量的 switch 语句
【发布时间】:2012-09-17 16:01:39
【问题描述】:

有人可以建议使用以下 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";
}

更新 我意识到我需要能够否定 ($color !== "blue") 并进行比较,而不是将变量等同于字符串。

【问题讨论】:

  • 您要解决的实际问题是什么?
  • @Stikmou 和 Renaat De Muynck 的回答完美地满足了提问者的问题。其他答案虽然肯定是合理的,但解决方案的方式略有不同。

标签: php switch-statement


【解决方案1】:

您可以更改比较的顺序,但这仍然不理想。

    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 语句看起来更好,并且将来更容易修改。
  • 我认为它很完美。对于现实世界,这是真正的开发人员使用的。
【解决方案2】:

不起作用。你可以用一些字符串连接来破解它:

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

但这很快就会变得丑陋。

【讨论】:

  • 请注意通常可能不匹配的模棱两可的值,例如打开'abc' . 'def',而情况是'ab' . 'cdef'。两组不同的值,但产生相同的连接结果。
  • 对于我正在做的事情不会有问题,但这是一个很好的建议。无论如何,谢谢你的伎俩!
  • 可能值得在字符串之间添加一个分隔字符,可能只是一个简单的逗号或不常用的字符(例如管道)?例如:$color.','.$size 然后比较'blue,small'
  • 我认为 Scuzzy 可能有正确的答案。我想不出在这种情况下否定一个变量的方法,即casce 'blue !small' 这种方式不可行,对吧?
  • 字符串的“非”只是一个布尔假值。如果您确实需要否定东西或测试不等式,则切换到正常的 if/then/else 结构。 case 语句用于对单个核心值进行多次相等测试。这种连接只是对它的滥用扩展,但你不能从根本上改变仍然只是一个相等测试的事实。
【解决方案3】:
var $var1 = "something";
var $var2 = "something_else";
switch($var1.$var2) {
case "somethingsomething_else":
    ...
    break;
case "something...":
    break;
case "......":
    break;
}

【讨论】:

    【解决方案4】:

    发现于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; 
    }
    ?>
    

    【讨论】:

      【解决方案5】:

      您的另一个选择(虽然不漂亮)是嵌套 switch 语句:

      switch($color){
          case "blue":
              switch($size):
                  case "small":
                  //do something
                  break;
          break;
      }
      

      【讨论】:

      • 我不推荐使用它,它实际上是非常糟糕的阅读和不好的做法。
      【解决方案6】:

      使用新的数组语法,这看起来就像你想要的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 2012-03-03
        • 2013-02-19
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多