Переключатель слишком часто срабатывает

Я не могу разобраться с этим. Возможно, есть простое решение, и проблема уже решена, но я не смог найти ответ.

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

Как вы уже догадались, предложение должно звучать так: «Я люблю тебя»

Но это фактический результат: я люблю тебя, ты любишь тебя

Как это вообще возможно, когда переключатель срабатывает только трижды.
Между тем я знаю, что проблему можно решить с помощью> break;< после каждого случая. Но я до сих пор не понимаю, зачем это нужно.
Я был бы очень рад, если бы кто-нибудь мог объяснить мне, что делает PHP.
С Днем Святого Валентина!

0

Решение

Когда дело 1 соответствует это также выполнит дело 2 а также 3 если нет перерыва.

Таким образом, каждый раз через цикл выполняется соответствующий случай и все последующее.

Первый раз: дело 1, 2, 3

Второй раз: дело 2, 3

В третий раз: дело 3

1

Другие решения

Для справки вот выдержка из PHP документация по свитчу, что объясняет это лучше, чем я мог бы. 🙂

Важно понимать, как выполняется оператор switch, чтобы избежать ошибок. Оператор switch выполняет построчно (фактически оператор за оператором). В начале, код не выполняется. Только когда оператор case найден со значением, совпадающим со значением выражения switch, PHP начинает выполнять операторы. PHP продолжает выполнять операторы до конца блока switch или до того момента, когда он впервые увидит оператор break. Если вы не напишете оператор break в конце списка операторов case, 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») только в том случае, если $ i равно 2. Таким образом, важно не забывать операторы break (даже если вы захотите избегать их преднамеренного предоставления при определенных обстоятельствах). ).

1

Когда вы не указываете 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';
}
0