Jak mogę przerwać zewnętrzną pętlę w PHP?

124

Chcę przerwać zewnętrzną pętlę for / foreach w PHP.

Można to zrobić w ActionScript w następujący sposób:

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

Jaki jest odpowiednik PHP?

Marty
źródło
7
Zawsze najpierw spójrz na dokumentację: php.net/manual/en/control-structures.break.php
Felix Kling
Opublikowałem 2 rozwiązania, jedno z etykietami, jak w scenariuszu akcji, a drugie, które po prostu używabreak
Edgar Villegas Alvarado

Odpowiedzi:

34

Podręcznik PHP mówi

break akceptuje opcjonalny argument liczbowy, który mówi mu, z ilu zagnieżdżonych struktur otaczających ma zostać przerwanych.

break 2;
Shakti Singh
źródło
16

Możesz użyć tylko instrukcji break-n:

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

Jeśli jesteś w php> = 5.3, możesz używać etykiet i gotoznaków, podobnie jak w ActionScript:

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

Ale gotonależy go używać ostrożnie. Goto jest złe (uważane za złą praktykę)

Edgar Villegas Alvarado
źródło
1
Goto ma całkiem ważne zastosowania. Nawet eval () nie jest zła (i jest). Ma jeszcze mniej zastosowań niż goto.
lucian303
1
Tak. Dlatego powiedziałem „goto należy używać ostrożnie”
Edgar Villegas Alvarado
W tej notatce uważam, że ta strona jest odpowiednia: php.net/manual/en/control-structures.goto.php
Ruggi
12

Możesz użyć break 2;do wyrwania się z dwóch pętli jednocześnie. To nie jest dokładnie to samo, co twój przykład z „nazwanymi” pętlami, ale wystarczy.

Jon
źródło
6
$i = new MovieClip();
foreach ($movieClipArray as $i)
{
    $nameArray = array();
    foreach ($nameArray as $n) 
        if ($i->name == $n) 
            break 2;
}
Jordan Arseno
źródło
Niezła próba konwersji całego dostarczonego kodu do PHP, chociaż instrukcja break nie robi tego, czego potrzebuję (kończy tylko wewnętrzną pętlę).
Marty
odśwież stronę :) Zastąpiłem przerwą 2 ... co zgodnie z instrukcją PHP: "break akceptuje opcjonalny argument liczbowy, który mówi mu, z ilu zagnieżdżonych struktur otaczających ma zostać wyłamanych."
Jordan Arseno
4

Użyj 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
źródło