uscire da if e foreach


277

Ho un ciclo foreach e un'istruzione if. Se viene trovata una partita, alla fine devo uscire dalla 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>
    }       
}

per php non js. non posso presumere che si comportino allo stesso modo.
au_stan,

6
Accidenti - Devo smettere di usare jQuery così tanto. perché questo ha ottenuto un downvote? +1, domanda perfettamente ragionevole e ben posta.
Signor

11
ho solo fatto la domanda perché (per qualsiasi motivo) non sono riuscito a avvolgere la testa attorno al documento di php break e ai loro esempi. tutto bene però. non sono qui per ottenere badge e punti, solo ottime risposte.
au_stan,

Risposte:


610

if non è una struttura ad anello, quindi non è possibile "uscirne".

Puoi, tuttavia, uscire foreachda semplicemente chiamando break. Nel tuo esempio ha l'effetto desiderato:

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

Solo per completezza per gli altri che si imbattono in questa domanda in cerca di una risposta.

breakaccetta un argomento facoltativo, che definisce quante strutture di loop dovrebbe rompere. Esempio:

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

Risultato risultante:

1 3 2 1!


37
+1 - Grandi esempi per qualcosa che i programmatori inesperti a volte hanno difficoltà.
Jim D,

1
Utile, grazie. Karma extra per menzionare l'argomento. La cosa if-loop sembra comunque un trucco. Perché non avvolgere il resto delle dichiarazioni in un'altra se? So che stavi solo cercando di essere d'aiuto, ma nota ai neofiti.
Dan Barron,

3
Per quelli di voi che atterrano qui, ma cercano come uscire da un ciclo che contenga un'istruzione include usare return invece di continue.
Nick Constantine,

E se fosse un'istruzione switch? Le istruzioni switch utilizzano anche le pause. Qualcuno metterebbe semplicemente due interruzioni all'interno dell'interruttore, ad esempio {case "break": echo 'break the switch and the loop'; break; break; }?
Jevon,

@Jevon no, dovresti anche semplicemente scrivere switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } le break 2foglie interne di entrambe le istruzioni switch.
Kaii

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

Basta usare break. Quello lo farà.


quindi la pausa si sta staccando dalla foreach e non dal if. penso che la mia confusione derivasse da questa affermazione che if ($abort_if_block) break;avevo originariamente impostato break 2e non è riuscita. grazie
au_stan

2
Fai attenzione al costrutto break. Se si dimentica il; dopo di ciò, potrebbe ottenere il risultato della prossima espressione e iniziare a comportarsi in modo imprevisto (IE salta fuori da molto più di quanto avresti voluto). So che tutti suggeriscono di non usare GOTO, ma penso che, per tutti quei casi in cui non puoi davvero fare di meglio che usare una pausa, un goto può essere un'opzione migliore. Certo, per il salto in avanti (neanche troppo lontano) solo e senza abusi! ;-)
maraspin

2

Un modo più sicuro per avvicinarsi alla rottura di un foreacho whileciclo in PHP è quello di nidificare una variabile contatore incrementale e ifcondizionale all'interno del ciclo originale. Questo ti dà un controllo più stretto di quello break;che può causare il caos altrove su una pagina complicata.

Esempio:

// 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;

La sintassi non è corretta. Se vuoi usare la endwhilefrase, devi scrivere while (..): ...; endwhile;- nota i due punti qui dopo while!
Kaii,

0

Per quelli di voi che atterrano qui ma cercano come uscire da un ciclo che contiene un'istruzione include usare return invece di break o 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);
    }
}

?>

Se vuoi rompere quando sei dentro do_this_for_even.php devi usare return. L'uso di break o continue restituirà questo errore: Impossibile interrompere / continuare 1 livello. Ho trovato maggiori dettagli qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.