切换太频繁了

时间:2015-02-14 17:12:33

标签: php loops switch-statement break

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

<?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;
    ?>

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

但那是实际的输出:我爱你,你爱你

当开关只被触发三次时,这怎么可能呢? 同时我知道问题可以通过&gt; break修复;&lt;在每个案件之后。但我仍然不明白为什么这是必要的。 如果有人能向我解释PHP正在做什么,我会很高兴。 情人节快乐!

3 个答案:

答案 0 :(得分:1)

当案例1匹配时,除非有休息,否则还会执行案例23

因此,每次循环时,都会执行匹配的案例和后续的所有内容。

  

第一次:案例123

     

第二次:案例23

     

第三次:案例3

答案 1 :(得分:1)

作为参考,这里是the PHP documentation on switch的摘录,它解释得比我想象的要好。 :)

  

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

<?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时,才会得到预期的行为(&#39; i等于2&#39;因此,重要的是不要忘记break语句(即使你可能想避免提供它们)在某些情况下的目的)。

答案 2 :(得分:0)

如果您未指定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';
}