Wie kann ich mit PHP eine äußere Schleife durchbrechen?


124

Ich möchte eine äußere for / foreach-Schleife in PHP durchbrechen.

Dies kann in ActionScript folgendermaßen erfolgen:

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

Was ist das PHP-Äquivalent?


7
Schauen Sie sich immer zuerst die Dokumentation an: php.net/manual/en/control-structures.break.php
Felix Kling

Ich habe 2 Lösungen gepostet, eine mit Labels, wie im Action-Skript und eine, die nur verwendetbreak
Edgar Villegas Alvarado

Antworten:



34

PHP-Handbuch sagt

break akzeptiert ein optionales numerisches Argument, das angibt, aus wie vielen verschachtelten umschließenden Strukturen herausgebrochen werden soll.

break 2;

16

Sie können nur eine break-n-Anweisung verwenden:

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

Wenn Sie in php> = 5.3 sind, können Sie Beschriftungen und gotos verwenden, ähnlich wie in ActionScript:

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

Aber gotomuss sorgfältig verwendet werden. Gehe zu ist böse (als schlechte Praxis angesehen)


1
Es gibt durchaus gültige Verwendungen für goto. Auch eval () ist nicht böse (und es ist). Es hat noch weniger Verwendungszwecke als goto.
Lucian303

1
Ja. Deshalb sagte ich "goto muss vorsichtig verwendet werden"
Edgar Villegas Alvarado

In dieser Notiz halte
Ruggi

12

Sie können verwenden break 2;, um aus zwei Schleifen gleichzeitig auszubrechen. Es ist nicht ganz das gleiche wie in Ihrem Beispiel mit den "benannten" Schleifen, aber es wird den Trick machen.


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

Netter Versuch, den gesamten bereitgestellten Code in PHP zu konvertieren, obwohl die break-Anweisung nicht das tut, was ich brauche (sie beendet nur die innere Schleife).
Marty

Aktualisiere deine Seite :) Ich habe sie durch break 2 ersetzt ... was laut PHP-Handbuch: "break akzeptiert ein optionales numerisches Argument, das angibt, aus wie vielen verschachtelten umschließenden Strukturen herausgebrochen werden soll."
Jordan Arseno

4

Verwenden Sie goto?

for ($i = 0, $j = 50; $i < 100; $i++) 
{
  while ($j--) 
  {
    if ($j == 17) 
      goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.