2015-02-14 2 views
0

Я не могу опустить голову. Может быть простое решение, и проблема уже решена, но я не мог найти ответа.Слишком часто включается переключатель

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

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

Но это фактический выход: я люблю youlove Youyou

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

+1

Вы [провалились] (HTTP: //en.wikipedia.org/wiki/Switch_statement # Патч);) – georg

ответ

1

В случае совпадения случая 1 он также выполнит случай 2 и 3, если нет перерыва.

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

Первый раз: случай 1, 2, 3

Второй раз: случай 2, 3

третий раз: случай 3

+0

Thx. Ваш ответ так же полезен. –

1

Для справки, вот выдержка из the PHP documentation on switch, что объясняет это лучше, чем я, вероятно. :)

Важно понимать, как выполняется инструкция switch, чтобы избежать ошибок. Оператор switch выполняет строку за строкой (фактически, оператор-оператор). В начале код не выполняется. Только когда оператор case найден со значением, которое соответствует значению выражения switch, PHP начинает выполнять инструкции. PHP продолжает выполнять инструкции до конца блока коммутатора или в первый раз, когда видит оператор 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"; 
} 
?> 

Здесь, если $ я равно 0, PHP выполнит все эхо заявления! Если $ i равно 1, PHP будет выполнять последние два выражения echo. Вы получите ожидаемое поведение ('i equals 2' будет отображаться), только если $ i равно 2. Таким образом, важно не забывать инструкции break (даже если вы, возможно, захотите избежать их назначения в определенных обстоятельствах).

+0

Thx для справки –

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'; 
} 
+0

Thx для практического примера. –

Смежные вопросы