Come posso interrompere un ciclo esterno con PHP?


124

Sto cercando di interrompere un ciclo for / foreach esterno in PHP.

Questo può essere fatto in ActionScript in questo modo:

top : for each(var i:MovieClip in movieClipArray)
{
    for each(var j:String in nameArray)
    {
        if(i.name == j) break top;
    }
}

Qual è l'equivalente PHP?


7
Dai sempre un'occhiata prima alla documentazione: php.net/manual/en/control-structures.break.php
Felix Kling

Ho pubblicato 2 soluzioni, una con le etichette, come nello script d'azione e l'altra che utilizza solobreak
Edgar Villegas Alvarado

Risposte:



34

Dice il manuale PHP

break accetta un argomento numerico opzionale che gli dice quante strutture racchiuse annidate devono essere eliminate.

break 2;

16

Puoi usare solo un'istruzione break-n:

foreach(...)
{
    foreach(...)
    {
        if (i.name == j) 
            break 2; //Breaks 2 levels, so breaks outermost foreach
    }
}

Se sei in php> = 5.3, puoi usare etichette gotoes, simili a quelle di ActionScript:

foreach (...)
{        
    foreach (...)
    {
        if (i.name == j) 
            goto top;
    }
}
top:

Ma gotodeve essere usato con attenzione. Goto è cattivo (considerato una cattiva pratica)


1
Ci sono usi abbastanza validi per goto. Anche eval () non è malvagio (e lo è). Ha anche meno usi di goto.
lucian303

1
Sì. Ecco perché ho detto "goto deve essere usato con attenzione"
Edgar Villegas Alvarado

In quella nota credo che questa pagina sia pertinente: php.net/manual/en/control-structures.goto.php
Ruggi

12

È possibile utilizzare break 2;per rompere due loop contemporaneamente. Non è proprio lo stesso del tuo esempio con i cicli "con nome", ma farà il trucco.


6
$i = new MovieClip();
foreach ($movieClipArray as $i)
{
    $nameArray = array();
    foreach ($nameArray as $n) 
        if ($i->name == $n) 
            break 2;
}

Bel tentativo di convertire l'intero codice fornito in PHP, anche se l'istruzione break non fa quello che mi serve (termina solo il ciclo interno).
Marty

aggiorna la tua pagina :) Ho sostituito con break 2 ... che secondo il manuale PHP: "break accetta un argomento numerico opzionale che gli dice da quante strutture recintanti annidate devono essere eliminate."
Jordan Arseno

4

Usa goto?

for ($i = 0, $j = 50; $i < 100; $i++) 
{
  while ($j--) 
  {
    if ($j == 17) 
      goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
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.