web-dev-qa-db-fra.com

sortir de si et pour chaque

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

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

Vous pouvez cependant sortir de foreach en appelant simplement break . Dans votre exemple, l'effet souhaité est le suivant:

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 tombent sur cette question à la recherche d’une réponse.

break prend un argument optionnel, qui définit le nombre de structures de boucle à rompre. 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 obtenu:

1 3 2 1!


Si - pour une raison obscure - vous voulez break sur une instruction if (qui n'est pas une structure en boucle et n'est donc pas cassable par définition), vous pouvez simplement envelopper votre if dans une structure en boucle minuscule afin vous pouvez sortir de ce bloc de code.

Veuillez noter qu'il s'agit d'un piratage total et que normalement vous ne voudriez 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 la documentation PHP _

Si vous vous interrogez sur la syntaxe: Cela fonctionne car une syntaxe abrégée est utilisée ici. Les accolades extérieures peuvent être omises car la structure de la boucle ne contient qu'une seule instruction: if ($foo) { .. }.

Un autre exemple pour cela:
do $i++; while ($i < 100) est équivalent à do { $i++; } while ($i < 100).

560
Kaii
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 . Ça va le faire.

11
Decent Dabbler

Une méthode plus sûre pour rompre une boucle foreach ou while dans PHP consiste à imbriquer une variable de compteur incrémentante et la condition if à l'intérieur de la boucle d'origine. Cela vous donne un contrôle plus étroit que break;, ce qui peut causer des dégâts 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
staypuftman

Pour ceux d'entre vous atterrissant ici mais cherchant 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 quand vous êtes dans do_this_for_even.php, vous devez utiliser return. Utiliser break ou continue va retourner cette erreur: Impossible de casser/continuer 1 niveau. J'ai trouvé plus de détails ici

0
Nick Constantine