[PHP] Multiple for(each), while escape

TL;TR;

PHP는 중접된 반복문을 원하는 개수만큼 탈출할 수 있는,
break 2;continue 2;를 지원한다.

다중 for문

PHP가 아니더라도 어디에든 다중 for문을 사용하는 것을 본적이 있을 것이다.
물론, for문이 중첩되어있는걸 보면 경기를 일으키는 사람도 있지만,
어쩔 수 없이 써야할수도 있고, 지식의 한계와 마감의 촉박함이 다중 for문을 만들어 낼 수 있는 부분은 어쩔수 없다.

뭐 그렇다치고, 모던 PHP그룹을 보던중 신기한(?) 문법을 발견해 정리겸 글을 남긴다.

어마아머한 3중 for문

<?php
$list_0 = [0, 1];
$list_1 = [2, 3];
$list_2 = [4, 5];
foreach ($list_0 as $v_0) {
    echo $v_0;
    foreach ($list_1 as $v_1) {
        echo $v_1;
        foreach ($list_2 as $v_2) {
            echo $v_2;
        }
    }
}

보통 이런 for문을 보면 현기증 부터오고 개발자의 얼굴을 보고 싶어지지만, 일단 넘어가기로 하고, 해당 코드를 실행하면 02453451245345 가 출력된다.

여기서 만약 3번째 for문 에서 break; 를 하게되면 당연스럽게도 2번째 for문으로 넘어가게된다.

하지만 3번째 for문 이후 첫번째 for문으로 넘어가기 위해선 아래와 같이 해주어야 한다.

<?php
$list_0 = [0, 1];
$list_1 = [2, 3];
$list_2 = [4, 5];
foreach ($list_0 as $v_0) {
    echo $v_0;
    foreach ($list_1 as $v_1) {
        echo $v_1;
        foreach ($list_2 as $v_2) {
            echo $v_2;
            break;
        }
        break;
    }
}

지금과 같이 단순한 경우엔 문제가 없지만, “만약 $v_2가 짝수이면 첫번째 for문으로 가고 홀수이면 그냥 진행 하고 싶다.”과 같은 조건문이 생기게 된다면 아래와 같이 복잡한 코드가 될것이다.

<?php
$list_0 = [0, 1];
$list_1 = [2, 3];
$list_2 = [4, 5];
foreach ($list_0 as $v_0) {
    echo $v_0;
    foreach ($list_1 as $v_1) {
        echo $v_1;
        foreach ($list_2 as $v_2) {
            echo $v_2;
            if ($v_2 % 2 === 0) break;
        }
        if ($v_2 % 2 === 0) break;
    }
}

if ($v_2 % 2 === 0) break;가 반복되면서 안그래도 복잡한 코드를 더욱 복잡하게 만들고있다. 또 이후에 홀수일때 break 하고 싶다면, 해당 구문을 모두 찾아 바꿔줘야하는 번거로움까지 있다.

이럴 때 간단히 원하는 개수만큼 break; 해주는 php문법인 break 2;를 사용할 수 있다.

<?php
$list_0 = [0, 1];
$list_1 = [2, 3];
$list_2 = [4, 5];
foreach ($list_0 as $v_0) {
    echo $v_0;
    foreach ($list_1 as $v_1) {
        echo $v_1;
        foreach ($list_2 as $v_2) {
            echo $v_2;
            if ($v_2 % 2 === 0) break 2;
        }
    }
}

이렇게 하면 만약 $v_2가 짝수일때 break 2;를 통해 바로 첫번째 for문까지 바로 점프하게 된다.

물론 break말고 continue도 위와같이 중첩된 반복문에서 원하는 개수만큼의 반복문을 탈출 할 수 있는 continue 2;문법을 지원한다.

글의 문제가 있다면 댓글을 달아 주세요.

This site uses Akismet to reduce spam. Learn how your comment data is processed.