if와 foreach에서 벗어나 다


277

foreach 루프와 if 문이 있습니다. 일치하는 것이 발견되면 궁극적으로 foreach에서 벗어날 필요가 있습니다.

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}

PHP가 아닌 js. 나는 그들이 똑같이 행동한다고 ​​생각할 수 없다.
au_stan

6
gee-jQuery 사용을 그만 두어야합니다. 왜 이것이 공감대를 얻었습니까? +1, 완벽하고 합리적이고 잘 제기 된 질문.
mrtsherman

11
나는 (어떤 이유로 든) PHP break doc과 그들의 예제 주위에 머리를 감쌀 수 없었기 때문에 질문을했습니다. 그래도 모두 좋아. 나는 배지와 포인트를 얻기 위해 여기에 있지 않고 단지 훌륭한 답변을 얻습니다.
au_stan

답변:


610

if 루프 구조가 아니므로 "분리 할 수 ​​없습니다".

그러나 foreach간단히 전화를 걸어서 벗어날 수 있습니다 break. 귀하의 예에서 원하는 효과가 있습니다.

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

답을 찾고있는이 질문에 걸려 넘어지는 다른 사람들을위한 완전성 ..

break선택적인 인수를 취하는데, 얼마나 많은 루프 구조를 끊어야 하는지 정의 합니다 . 예:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

결과 출력 :

1 3 2 1!


37
+1-경험이없는 프로그래머가 때때로 어려움을 겪는 것에 대한 훌륭한 예.
Jim D

1
유용합니다. 감사합니다. 논쟁을 언급 한 추가 카르마. 그러나 if-loop는 해킹처럼 보입니다. 왜 나머지 문장을 다른 문장으로 감싸지 않겠습니까? 나는 당신이 단지 도움을 주려고 노력하고 있다는 것을 알고 있지만 초보자들에게 주목하십시오.
Dan Barron

3
여기에 착륙하지만 include 문을 포함하는 루프에서 벗어나는 방법을 검색하는 경우 계속 대신 return을 사용하십시오.
Nick Constantine

switch 문은 어떻게됩니까? 스위치 문도 나누기를 사용합니다. 누군가가 단순히 스위치 안에 두 개의 나누기를 넣을 것인가? 예 : {case "break": echo '스위치와 루프 끊기'; 휴식; 휴식; }?
Jevon December

@Jevon 아니 당신은 또한 단순히 switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } 내부 break 2스위치 두 스위치 문을 작성합니다.
Kaii

13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

간단하게 사용하십시오 break. 그렇게 할 것입니다.


그렇다면 브레이크는 if가 아니라 foreach에서 끊어집니다. 나는 내 혼란이 if ($abort_if_block) break;원래 설정 한이 진술에서 왔고 break 2실패 했다고 생각 합니다. 감사
au_stan

2
휴식 구조를 조심하십시오. 당신이 잊어 버린 경우; 그 후, 그것은 다음 표현의 결과를 얻고 예기치 않게 행동하기 시작할 수 있습니다 (IE가 원했던 것보다 훨씬 뛰어납니다). 나는 모든 사람들이 GOTO의 사용에 대해 제안한다고 알고 있지만, 휴식을 사용하는 것보다 실제로 더 잘 할 수없는 모든 경우에 goto가 더 나은 옵션 일 수 있다고 생각합니다. 물론, 앞으로 점프 (너무 멀리 있지 않음)하고 남용없이! ;-)
maraspin

2

PHP에서 foreachor while루프를 깨는 데 더 안전한 방법 은 증가하는 카운터 변수와 if조건을 원래 루프 안에 중첩시키는 것 입니다. 이렇게하면 break;복잡한 페이지에서 다른 곳을 혼란스럽게 할 수있는 것보다 더 엄격하게 제어 할 수 있습니다.

예:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;

구문이 올바르지 않습니다. endwhile명령문 을 사용하려면 while (..): ...; endwhile;다음에 콜론 을 기록 하십시오 while!
Kaii

0

여기에 착륙하지만 include 문을 포함하는 루프에서 벗어나는 방법을 검색하는 경우 break 또는 continue 대신 return을 사용하십시오.

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

do_this_for_even.php 안에있을 때 깨고 싶다면 return을 사용해야합니다. break 또는 continue를 사용하면이 오류가 반환됩니다. 1 단계를 중단 / 계속할 수 없습니다. 자세한 내용은 여기 에서 찾았 습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.