вырваться из если и 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.