se détacher de if et foreach

j'ai une boucle pour chaque boucle et une déclaration if. Si une correspondance est trouvée, je dois finir par me détacher de l'avant-bras.

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>
    }       
}
231
demandé sur Kaii 2012-02-09 21:19:36

4 réponses

if n'est pas une structure de boucle, donc vous ne pouvez pas "en sortir".

vous pouvez, cependant, sortir du foreach en appelant simplement break . Dans votre exemple, il a l'effet désiré:

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();
}

juste pour être complet pour les autres qui trébuchent sur cette question à la recherche d'une réponse..

break prend un argument optionnel, qui définit combien structures de boucle il devrait casser. Exemple:

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 "!";

sortie résultante:

1 3 2 1 !


si - pour une raison obscure - vous voulez break hors d'une déclaration if (qui n'est pas une structure de boucle et donc non cassable) par définition), vous pouvez simplement envelopper votre if dans une structure de boucle minuscule de sorte que vous pouvez sauter hors de ce bloc de code.

s'il vous Plaît noter que ce est un total de hack et normalement vous ne voulez pas le faire:

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

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

  // Continue doing something...

} while (false);

l'exemple ci-dessus est tiré d'un commentaire dans les docs PHP

si vous vous interrogez sur la syntaxe: elle fonctionne parce qu'une syntaxe abrégée est utilisée ici. Les bagues extérieures bouclées peut être exclu parce que la structure de boucle ne contient qu'une seule instruction: if ($foo) { .. } .

un autre exemple pour ce:

do $i++; while ($i < 100) est l'équivalent de do { $i++; } while ($i < 100) .

506
répondu 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;
    }
}

utilisez simplement break . Qui va le faire.

10
répondu Decent Dabbler 2012-02-09 17:22:30

une façon plus sûre d'aborder la rupture d'une boucle foreach ou while en PHP consiste à insérer une contre-variable incrémentante et if conditionnelle à l'intérieur de la boucle originale. Cela vous donne un contrôle plus serré que break; qui peut causer des ravages ailleurs sur une page compliquée.

exemple:

// 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
répondu staypuftman 2017-05-05 16:47:34

pour ceux d'entre vous qui atterrissent ici, mais qui cherchent comment sortir d'une boucle qui contient une instruction include, utilisez return au lieu de break ou 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);
    }
}

?>

si vous voulez casser quand vous êtes à l'intérieur do_this_for_even.php vous devez utiliser return. Utiliser break ou continue va retourner cette erreur: ne peut pas break / continue 1 niveau. J'ai trouvé plus de détails ici

0
répondu Nick Constantine 2018-04-12 15:50:03