342 votes

sortir du if et du foreach

J'ai une boucle foreach et une instruction if. Si une correspondance est trouvée, je dois sortir de la boucle 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>
    }
}

0 votes

Pour php et non pour js. Je ne peux pas supposer qu'ils se comportent de la même manière.

7 votes

Il faut que j'arrête d'utiliser autant jQuery. pourquoi cette question a-t-elle reçu un vote négatif ? +1, question parfaitement raisonnable et bien posée.

13 votes

Je n'ai posé la question que parce que (pour une raison quelconque) je n'arrivais pas à comprendre la doc php break et ses exemples. tout va bien cependant. je ne suis pas ici pour obtenir des badges et des points, juste de bonnes réponses.

743voto

Kaii Points 7818

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

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

$device = "wanted";
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;
        some_function(); // never reached!
    }
    another_function();  // not executed after match/break
}

Juste pour être complet, pour les autres qui tomberont sur cette question en cherchant une réponse

break prend un argument facultatif, qui définit combien de structures en boucle, il devrait se briser. 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 "!";

Résultat :

1 3 2 1 !

48 votes

+1 - De très bons exemples pour un sujet qui pose parfois problème aux programmeurs inexpérimentés.

2 votes

Utile, merci. Karma supplémentaire pour avoir mentionné l'argument. Le truc du if-loop semble être un hack, cependant. Pourquoi ne pas simplement envelopper le reste des déclarations dans un autre if ? Je sais que tu essayais juste d'être utile, mais note aux débutants.

3 votes

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 continue.

17voto

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

Il suffit d'utiliser break . Cela fera l'affaire.

0 votes

Donc la rupture provient du foreach et non du if. je pense que ma confusion vient de cette déclaration if ($abort_if_block) break; J'avais initialement prévu break 2 et ça a échoué. Merci

2 votes

Attention à la construction en rupture. Si vous oubliez le ; après, il pourrait obtenir le résultat de l'expression suivante et commencer à se comporter de manière inattendue (c'est-à-dire sauter beaucoup plus que vous ne l'auriez voulu). Je sais que tout le monde déconseille l'utilisation de GOTO, mais je pense que, pour tous les cas où vous ne pouvez pas vraiment faire mieux que d'utiliser un break, un goto peut être une meilleure option. Bien sûr, uniquement pour les sauts en avant (pas trop loin non plus) et sans abus ! ;-)

2voto

staypuftman Points 447

Une façon plus sûre d'aborder la rupture d'un foreach o while boucle en PHP est d'imbriquer une variable compteur incrémentée et if conditionnel à l'intérieur de la boucle originale. Cela vous donne un contrôle plus serré que break; ce qui peut causer des ravages ailleurs dans 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;

0voto

Nick Constantine Points 334

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 faire une pause lorsque vous êtes dans do_this_for_even.php, vous devez utiliser return. L'utilisation de break ou continue renverra cette erreur : Cannot break/continue 1 level. J'ai trouvé plus de détails aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X