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?

Marty
la source
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;
Shakti Singh
la source
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)

Edgar Villegas Alvarado
la source
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.

Jon
la source
6
$i = new MovieClip();
foreach ($movieClipArray as $i)
{
    $nameArray = array();
    foreach ($nameArray as $n) 
        if ($i->name == $n) 
            break 2;
}
Jordan Arseno
la source
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';
Petr Abdulin
la source