Comment puis-je rompre une boucle externe avec PHP?


124

Je cherche à briser une boucle externe for / foreach en PHP.

Cela peut être fait dans ActionScript comme ceci:

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

Quel est l'équivalent PHP?


7
Jetez toujours un œil à la documentation en premier: php.net/manual/en/control-structures.break.php
Felix Kling

J'ai publié 2 solutions, l'une avec des étiquettes, comme dans le script d'action et l'autre qui utilise justebreak
Edgar Villegas Alvarado

Réponses:



34

Manuel PHP dit

break accepte un argument numérique optionnel qui lui indique le nombre de structures englobantes imbriquées à séparer.

break 2;

16

Vous pouvez utiliser simplement une instruction break-n:

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

Si vous êtes dans php> = 5.3, vous pouvez utiliser des étiquettes et des gotos, similaires à ActionScript:

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

Mais gotodoit être utilisé avec précaution. Goto est mal (considéré comme une mauvaise pratique)


1
Il existe des utilisations tout à fait valables pour goto. Même eval () n'est pas mauvais (et c'est le cas). Il a encore moins d'utilisations que goto.
lucian303

1
Oui. C'est pourquoi j'ai dit "goto doit être utilisé avec précaution"
Edgar Villegas Alvarado

Dans cette note, je pense que cette page est pertinente: php.net/manual/en/control-structures.goto.php
Ruggi

12

Vous pouvez utiliser break 2;pour sortir de deux boucles en même temps. Ce n'est pas tout à fait la même chose que votre exemple avec les boucles «nommées», mais cela fera l'affaire.


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

Bien essayé de convertir tout le code fourni en PHP, bien que l'instruction break ne fasse pas ce dont j'ai besoin (elle ne fait que terminer la boucle interne).
Marty

rafraichissez votre page :) J'ai remplacé par break 2 ... qui selon PHP Manual: "break accepte un argument numérique optionnel qui lui indique le nombre de structures englobantes imbriquées dont il faut sortir."
Jordan Arseno

4

Utilisez goto?

for ($i = 0, $j = 50; $i < 100; $i++) 
{
  while ($j--) 
  {
    if ($j == 17) 
      goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.