我无法理解这一点。可能有一个简单的解决方案,问题已经解决,但我找不到答案。
<?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正在做什么,我会很高兴。 情人节快乐!
答案 0 :(得分:1)
当案例1
匹配时,除非有休息,否则还会执行案例2
和3
。
因此,每次循环时,都会执行匹配的案例和后续的所有内容。
第一次:案例
1
,2
,3
第二次:案例
2
,3
第三次:案例
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';
}