2012-02-09 10 views
206

Ho un ciclo foreach e un'istruzione if. Se viene trovata una partita, ho bisogno di uscire definitivamente dal foreach.breakout of if e 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

per PHP non js. non posso presumere che si comportino allo stesso modo. –

+5

gee: devo smettere di usare jQuery così tanto. perché questo ha avuto un downvote? +1, domanda perfettamente ragionevole e ben posta. – mrtsherman

+9

ho fatto solo la domanda perché (per qualsiasi motivo) non potevo girare la testa intorno al documento di php break e ai loro esempi. tutto bene però. non sono qui per ottenere badge e punti, solo belle risposte. –

risposta

448

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

È tuttavia possibile uscire dallo foreach 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 imbattervi in ​​questo domanda in cerca di una risposta ..

break prende un argomento opzionale, che definisce quanti strutture di loop che dovrebbero rompersi. 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 "!"; 

risultante uscita:

1 3 2 1!


Se - per qualche oscura ragione - si vuole break fuori di un if dichiarazione (che non non è una struttura ad anello e quindi fragile per definizione), si può semplicemente avvolgere il vostro if in un piccolo ciclo struttura in modo da poter saltare fuori da quel blocco di codice.

Si prega di notare che questo è un hack totale e normalmente non si vuole fare questo:

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'esempio precedente è preso da un comment in the PHP docs

Se vi chiedete sulla sintassi: funziona perché qui viene usata una sintassi abbreviata. Le parentesi graffe esterne possono essere tralasciate perché la struttura del loop contiene solo una singola istruzione: if ($foo) { .. }.

Un altro esempio:
do $i++; while ($i < 100) equivale a do { $i++; } while ($i < 100).

+30

+1 - Grandi esempi per i programmatori inesperti a volte con cui lottano. –

+1

Utile, grazie. Karma extra per menzionare l'argomento. La cosa if-loop sembra un trucco, però. Perché non avvolgere il resto delle affermazioni in un altro se? So che stavi solo cercando di essere utile, ma nota ai neofiti. –

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

sufficiente utilizzare break. Questo lo farà.

+0

quindi l'interruzione si interrompe dal foreach e non dal if. Penso che la mia confusione sia stata da questa affermazione 'if ($ abort_if_block) break;' avevo originariamente impostato 'break 2' e non è riuscito. grazie –

+2

Attenzione per la costruzione della rottura. Se dimentichi il; dopo di ciò, potrebbe ottenere il risultato della prossima espressione e iniziare a comportarsi inaspettatamente (IE saltando fuori molto più di quanto avresti voluto). So che tutti suggeriscono contro l'uso di GOTO, ma penso che, per tutti quei casi in cui non si può davvero fare di meglio che usare una pausa, un goto può essere un'opzione migliore. Certo, per il salto in avanti (non troppo lontano) solo e senza abusi! ;-) – maraspin

1

Un modo più sicuro per affrontare la rottura di un ciclo o while in PHP è quello di nidificare una variabile contatore incrementale e all'interno del ciclo originale. Questo ti dà un controllo più stretto di 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;