【问题标题】:Executing multiple case using PHP switch statement使用 PHP switch 语句执行多个案例
【发布时间】:2011-08-19 05:55:14
【问题描述】:

例如,我必须根据一个值执行多组指令。

$value = 'AA';
switch ($value) {
    case 'AA':
        echo "value equals  1";
    continue;
    case 'BB':
        echo "value equals 2";
    continue;
    case 'CC' || 'AA':
        echo "value equals 3";
    break;
}

我对上述代码的期望是它应该根据传递的值执行多个案例,变量 $value 包含 AA 作为值,因此我希望它同时执行

case 'AA'
case 'CC' || 'AA'

所以它应该打印出value equals 1 value equals 3,但它不会以这种方式执行它,我只得到value equals 1 作为输出。如果我从语句中删除continue,它将执行所有三个cases,这在逻辑上是错误的。 PHP 的 switch 语句是否支持基于单个值执行多个案例?有什么解决方法吗?

谢谢你..

【问题讨论】:

    标签: php switch-statement


    【解决方案1】:

    当缺少break 时,switch 语句会启用下一个条件:

    $value = 'AA';
    switch ($value) {
        case 'AA':
            echo "value equals  1"; // this case has no break, enables fallthrough
        case 'CC':
            echo "value equals 3"; // this one executes for both AA and CC
        break;
        case 'BB':
            echo "value equals 2";
        break;
    }
    

    【讨论】:

    • 哦,好吧,所以switch语句没有办法支持根据条件执行多个案例。?如果它在没有发现中断的情况下允许失败,那么它不应该检查下一个案例条件并基于它允许或跳过另一个条件吗?
    • @Ibrahim Azhar Armar:可以执行多个案例,通过相应地安排贯穿结构和条件。实际上,我的第一个示例有点偏离,请尝试当前示例 - 它为 AA 执行多个案例。
    • 现在的行为到底有什么不同?如果第一个案例失败并且下一个案例仅检查CC,它看起来应该相同。跌倒时不是完全忽略了条件吗?
    • 是的。除非我相应地构造值,否则这将不起作用。例如,如果值是脱离上下文传递的,它仍然会执行中间情况。尝试将DD 分配给与上下文无关的$value,它将执行中间情况。而如果传递的值超出上下文,我希望代码根本不会运行。
    • @Ibrahim Azhar Armar:实际上@kapep 无意中指出了我之前的更新引入的一个错误。 ||-ing 两个非零字面量总是产生 true,因此它匹配每个非零 $value。这使得表达式毫无意义,可以将 case 'AA' || 'CC' 替换为 case true 并具有相同的行为。无论如何,我回滚了之前的更改。 Fallthrough 多次执行仅取决于breakless case 的排序。值表达式仅用作初始入口点。
    【解决方案2】:

    switch 语句需要在 case 块中使用文字。请改用if 语句。

    您可以使用其他类型的循环到iterate 通过值,然后使用IF 进行比较。在switch 情况下,无法进行比较/条件检查。

    完成你想做的事情的一种方法是这样的(注意 IF 正在使用):

    $value = 'AA';
    switch($value)
    {
        case ('AA'):
            echo "value equals 1<br />";
        case ('BB'):
            if ($value == 'BB'){
                echo "value equals 2<br />";
            }
        case (('AA') || ('CC')):
            echo "value equals 3<br />";
            break;
    }
    

    输出:

    value equals 1
    value equals 3
    

    注意:- 上述解决方案是不正确的,尽管它输出您需要的不是正确的解决方案,如果可能的话,我建议避免。使用非开关/案例替代方案可以轻松解决您的需求。

    【讨论】:

      【解决方案3】:

      解决方法是使用一组ifelse if 语句。不评估 case 语句中的条件。

      if($value == 'AA') {
          echo "value equals 1";
      }
      else if($value == 'CC') {
          echo "value equals 3";
      }
      else { //Or else if($value == 'BB') if you might add more at some point
          echo "value equals 2";
      }
      

      continue(或break 语句)结束每个case。如果省略,则执行将一直到下一个 case (这就是为什么在您的情况下所有三个都被执行 - 它会一直执行到最后。如果遇到 continuebreak在一个已经失败的case 中,执行将停止在那里)。

      【讨论】:

      • 我不能使用 if else 因为代码需要根据值执行多次,例如 Value AA 可以执行条件 1 和 3,或条件 1 和 2 和 3 或任何一个条件。 if else 将在执行第一个时出现。我想唯一遗漏的方法是使用多个if
      【解决方案4】:

      阅读文档后,我发现 switch 语句可以有多个判断为 true 的 case,但不能有多个判断为 true 的 case 块。

      此外,文档指出 break;continue;switch 范围内是等效的。

      如果您将所有 break;continue; 语句排除在外,您将看到无论匹配如何,它们都会打印。对于这个难题,您必须使用不那么酷的 if/else/ifelse 语句。

      http://php.net/manual/en/control-structures.switch.php

      【讨论】:

      • 那行不通。我以前从未在 switch 中看到过重复的情况,所以我尝试了一下,认为这是一个很酷的概念。不幸的是,它只评估第一个实例,所以它只打印value equals 1,而不是value equals 3
      • 确定@Patrick Robert Shea O'Connor。正在寻找您的回复:)
      • continue 在 switch 语句中不会使 switch 成为循环。就算是这样,不修改条件,也是无穷无尽的。
      • @kapep 这就是我的意思,break;continue;switch 范围内是同一件事,它们都打破了switch 并结束任何进一步处理报表。 switch 或就此而言 if/else 不是循环。 for/while 是可以环绕 if/elseswitch 的循环。
      【解决方案5】:

      你需要这样写你的代码 当我们检查多个条件时,我们需要在其中添加条件语句。

      $value = 'AA';
      switch ($value) {
          case 'AA':
              echo "value equals  1";
          continue;
          case 'BB':
              echo "value equals 2";
          continue;
          case $value == 'CC' || $value=='AA':
              echo "value equals 3";
          break;
      }
      

      或者您可以简单地以这种格式编写代码(为此设置两种不同的情况)

      $value = 'AA';
      switch ($value) {
          case 'AA':
              echo "value equals  1";
          continue;
          case 'BB':
              echo "value equals 2";
          continue;
          case 'CC':
          case 'AA':
              echo "value equals 3";
          break;
      }
      

      【讨论】:

        【解决方案6】:
        $value = 'AA';
        switch ($value) {
            case 'AA':
                echo "value equals 1";
                echo "value equals 3";
            break;
            case 'BB':
                echo "value equals 2";
            break;
            case 'CC':
                echo "value equals 3";
            break;
        }
        

        【讨论】:

        • 请在您的答案中添加一些解释,以便其他人可以从中学习。据我所知,您不会为AA 运行第三种情况@
        猜你喜欢
        • 2011-01-11
        • 2015-06-21
        • 1970-01-01
        • 2015-12-06
        • 2014-01-03
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多