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;
문법을 지원한다.