PHP에서 루프를 '종료'할 수 있습니까?


118

내 PHP 코드에서 오류 검사를 수행하는 루프가 있습니다. 원래는 이렇게 생겼는데 ...

foreach($results as $result) {
    if (!$condition) {
        $halt = true;
        ErrorHandler::addErrorToStack('Unexpected result.');
    }

    doSomething();
 }

if (!$halt) {
    // do what I want cos I know there was no error
}

이것은 모두 잘 작동하지만 한 번의 오류 후에도 필요하지 않아도 여전히 반복됩니다. 루프에서 벗어날 수있는 방법이 있습니까?

답변:


211

break 문을 찾고 있습니다.

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list(, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}

13
@Gabriel, 그것은 질문에 대답합니다. 코드 샘플은 정확히 샘플입니다. 설명이없는 "$ arr"배열 이름에 대해 불평 할 수도 있습니다.
paxdiablo

5
@Gabriel : PHP 매뉴얼에서 직접 참조하는 코드를 게시하고 있으며 break 문 사용을 정확하게 보여줍니다.
TheTXI

@Pax, 그것은 주관적입니다. 예제를 넣을 때마다 실제 코드를 넣으려고했습니다.
Gabriel Sosa

1
@Gabriel : 당신은 예제를 전혀 게시하지 않았고, 당신이 준 링크는 내가 제공 한 것과 똑같은 소스로 이동합니다 (샘플 코드가 맨 위에있는 곳입니다). 기본적으로 내가 한 것과 똑같은 일을했지만 OP가 링크를 클릭 할 때까지 샘플을 볼 수 없도록 만들었습니다.
TheTXI

3
이다 그러나 루프 이상한 방법!
alex

151

다른 게시물에서 언급했듯이 break 키워드를 사용할 수 있습니다. 힌트되었지만 설명되지 않은 한 가지는 키워드가 숫자 값을 사용하여 PHP에 얼마나 많은 수준에서 벗어날 수 있는지 알려줄 수 있다는 것입니다.

예를 들어, 정보 조각을 찾으려고 서로 중첩 된 세 개의 foreach 루프가있는 경우 'break 3'을 수행하여 세 개의 중첩 된 루프를 모두 벗어날 수 있습니다. 이것은 'for', 'foreach', 'while', 'do-while'또는 'switch'구조에서 작동합니다.

$person = "Rasmus Lerdorf";
$found = false;

foreach($organization as $oKey=>$department)
{
   foreach($department as $dKey=>$group)
   {
      foreach($group as $gKey=>$employee)
      {
         if ($employee['fullname'] == $person)
         {
            $found = true;
            break 3;
         }
      } // group
   } // department
} // organization

5
좋은 지적. 그것은 상단 근처의 PHP 매뉴얼에 아주 명확하게 설명되어 있습니다. 나는 이것이이 특정 질문에 대해 필수적이라고 생각하지 않지만 여전히 알아두면 매우 좋습니다. +1
TheTXI

46

break; 루프를 떠납니다.

continue; 조건이 여전히 참인 한 루프의 나머지 부분에 대한 코드를 건너 뛰고 다음 루프로 이동합니다.


단지 내가 필요로하는 것 .. 그 "계속"은 현재 루프만을 끊고 전체 루프를 끊는 것처럼 떠나지 않는다.
K. Kilian Lindberg 2014


4

이 모든 것이 좋은 대답이지만 더 나은 코드 표준이라고 생각하는 한 가지 더 제안하고 싶습니다. 루프를 계속하고 break모두 함께 사용하지 않는지 여부를 나타내는 루프 조건에서 플래그를 사용하도록 선택할 수 있습니다 .

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
$length = count($arr);
$found = false;
for ($i = 0; $i < $length && !$found; $i++) {
    $val = $arr[$i];
    if ($val == 'stop') {
        $found = true; // this will cause the code to 
                       // stop looping the next time 
                       // the condition is checked
    }
    echo "$val<br />\n";
}

break사용되는 범위에 의존하지 않기 때문에 더 나은 코드 실행이라고 생각합니다 . 오히려 특정 루프를 중단할지 여부를 나타내는 변수를 정의합니다. 이는 중첩되거나 순차적 일 수도 있고 아닐 수도있는 루프가 많은 경우에 유용합니다.


3
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.