вырваться из if и foreach


У меня есть цикл 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>
    }       
}
Author: Kaii, 2012-02-09

4 answers

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 !


Если - по какой-то неясной причине - вы хотите break из оператора if (который не является структурой цикла и, следовательно, не может быть разбит по определению) вы можете просто обернуть свой if в крошечную структуру цикла, чтобы вы могли выскочить из этого блока кода.

Пожалуйста, обратите внимание, что это полный взлом, и обычно вы не хотели бы этого делать:

do if ($foo)
{
  // Do something first...

  // Shall we continue with this block, or exit now?
  if ($abort === true) break;

  // Continue doing something...

} while (false);

Приведенный выше пример взят из комментария в PHP документы

Если вас интересует синтаксис: Он работает, потому что здесь используется сокращенный синтаксис. Внешние фигурные скобки можно опустить, поскольку структура цикла содержит только один оператор: if ($foo) { .. }.

Еще один пример для этого:
do $i++; while ($i < 100) эквивалентно do { $i++; } while ($i < 100).

 506
Author: Kaii, 2017-10-04 19:52:10
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. Это сделает это.

 10
Author: Decent Dabbler, 2012-02-09 17:22:30

Более безопасный способ приблизиться к разрыву цикла 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;
 2
Author: staypuftman, 2017-05-05 16:47:34

Для тех из вас, кто приземляется здесь, но ищет, как выйти из цикла, содержащего оператор include, используйте 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 уровень. Я нашел более подробную информацию здесь

 0
Author: Nick Constantine, 2018-04-12 15:50:03