вырваться из если и foreach


277

У меня есть цикл foreach и оператор if. Если совпадение найдено, мне нужно в конечном итоге вырваться из foreach.

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}

для PHP не JS. Я не могу предположить, что они ведут себя одинаково.
au_stan

6
ну и дела - я должен прекратить использовать JQuery так много. почему это получило отрицательный голос? +1, вполне разумный и правильно поставленный вопрос.
Мртшерман

11
я только задал вопрос, потому что (по какой-то причине) я не мог обернуться вокруг документа php break и их примеров. все хорошо, хотя. Я здесь не для того, чтобы получать значки и баллы, просто отличные ответы.
au_stan

Ответы:


610

if не является структурой цикла, поэтому вы не можете «вырваться из нее».

Вы можете, однако, вырваться, foreachпросто позвонив break. В вашем примере это имеет желаемый эффект:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

Просто для полноты для тех, кто наткнулся на этот вопрос в поисках ответа ..

breakпринимает необязательный аргумент, который определяет, сколько структур цикла он должен разорвать. Пример:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

Результирующий вывод:

1 3 2 1!


37
+1 - отличные примеры для чего-то неопытного программиста, с которым иногда борются.
Джим Д

1
Полезно, спасибо. Дополнительная карма за упоминание аргумента. Хотя, цикл if выглядит как хак. Почему бы просто не обернуть остальные утверждения в другое, если? Я знаю, что вы просто пытались быть полезными, но обратите внимание на новичков.
Дэн Баррон

3
Для тех, кто приземляется здесь, но ищет, как выйти из цикла, содержащего оператор включения, используйте return вместо continue.
Ник Константин

Что делать, если это заявление переключения? Операторы Switch также используют разрывы. Будет ли кто-нибудь просто поместить два перерыва в коммутатор, например: {case "break": echo 'break the switch and the loop'; перерыв, перерыв; }?
Джевон

@Jevon нет, вы также просто написали switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } бы внутренние break 2листы обоих операторов switch.
Кай

13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

Просто используйте break. Это сделает это.


так что тогда разрыв от foreach, а не if. я думаю, что мое замешательство было из-за этого заявления, которое if ($abort_if_block) break;я первоначально сделал, break 2и оно провалилось. спасибо
au_stan

2
Остерегайтесь конструкции разрыва. Если вы забыли; после этого он может получить результат следующего выражения и начать вести себя неожиданно (IE выпрыгивает из гораздо большего, чем вы бы хотели). Я знаю, что все предлагают против использования GOTO, но я думаю, что для всех тех случаев, когда вы не можете добиться большего успеха, чем использование перерыва, goto может быть лучшим вариантом. Конечно, для прыжков вперед (не слишком далеко) только и без злоупотреблений! ;-)
maraspin

2

Более безопасный способ приблизиться к разрыву цикла foreachили whileв PHP - это вложить инкрементную переменную-счетчик и ifусловно в исходный цикл. Это дает вам более жесткий контроль, чем тот, break;который может вызвать хаос в других местах на сложной странице.

Пример:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;

Синтаксис не правильный. Если вы хотите использовать это endwhileутверждение, вам нужно написать while (..): ...; endwhile;- запишите здесь двоеточие while!
Кайи

0

Для тех, кто приземляется здесь, но ищет, как выйти из цикла, содержащего оператор включения, используйте return вместо break или continue.

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

Если вы хотите прерваться, находясь внутри do_this_for_even.php, вам нужно использовать return. Использование break или continue вернет эту ошибку: Невозможно прервать / продолжить 1 уровень. Я нашел больше деталей здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.