【问题标题】:Switch too often triggered开关过于频繁触发
【发布时间】:2015-02-14 17:12:32
【问题描述】:

我无法理解这一点。可能有一个简单的解决方案,并且问题已经解决,但我找不到答案。

<?php
    $string = '';
    $array = array(1, 2, 3);
    foreach($array as $number) {
        switch($number) {
            case '1':
                $string .= 'I ';
            case '2':
                $string .= 'love ';
            case '3':
                $string .= 'you';
        }
    }
    echo $string;
    ?>

你可能已经猜到了,产生的句子应该是:我爱你

但那是实际的输出:I love youlove youyou

当开关只触发三次时,这怎么可能。 同时我知道问题可以通过 >break;

【问题讨论】:

标签: php loops switch-statement break


【解决方案1】:

当 case 1 匹配时,它还将执行 case 23,除非有中断。

所以每次循环都会执行匹配的 case 和后面的所有内容。

第一次:案例123

第二次:案例23

第三次:案例3

【讨论】:

  • 谢谢。您的回答尽可能简短。
【解决方案2】:

作为参考,这里是the PHP documentation on switch 的摘录,它比我可能会更好地解释它。 :)

了解 switch 语句的执行方式对于避免错误很重要。 switch 语句逐行执行(实际上是逐语句执行)。一开始,没有代码被执行。只有当 case 语句的值与 switch 表达式的值匹配时,PHP 才会开始执行语句。 PHP 继续执行语句,直到 switch 块结束,或者它第一次看到 break 语句。如果你不在一个case语句列表的末尾写一个break语句,PHP会继续执行下一个case的语句。例如:

<?php
switch ($i) {
    case 0:
        echo "i equals 0";
    case 1:
        echo "i equals 1";
    case 2:
        echo "i equals 2";
}
?>

这里,如果 $i 等于 0,PHP 将执行所有的 echo 语句!如果 $i 等于 1,PHP 将执行最后两个 echo 语句。仅当 $i 等于 2 时,您才会得到预期的行为(将显示“i 等于 2”)。因此,重要的是不要忘记 break 语句(即使在某些情况下您可能希望避免故意提供​​它们)。

【讨论】:

  • 谢谢参考
【解决方案3】:

如果您不指定 break,代码执行将直接进入下一个案例。

例如,分数为 10 分的试卷可以这样评分:

switch ($score)
{
    case 10:
        // A+ when score is 10
        echo 'A+';
        break;
    case 9:
    case 8:
        // A when score is 8 or 9
        echo 'A';
        break;
    case 7:
    case 6:
        // B when score is 7 or 6
        echo 'B';
        break;
    case 5:
    case 4:
    case 3:
        // C when score between 3 and 5
        echo 'C';
        break;
    default:
        // Failed if score is less than 3
        echo 'Failed';
}

【讨论】:

  • 感谢实例。
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多