PHP foreach 루프란?
foreach 문은 PHP에서 제공하는 반복문(loop) 구조 중 하나입니다. while, do-while, for 같은 다른 반복문이 주로 조건에 따라 반복하거나 정해진 횟수만큼 반복하는 데 사용되는 반면, foreach 루프는 배열의 요소를 처음부터 끝까지 순회(iterate)하는 데 특화되어 있어 배열 작업 시 가장 널리 쓰이는 반복문입니다.
기본 문법
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement첫 번째 형태는 인덱스 배열(indexed array)을 순회할 때 사용합니다. 반복이 진행될 때마다 현재 요소가 $value 변수에 할당되며, PHP는 내부 포인터를 다음 요소로 이동시켜 배열의 끝에 도달할 때까지 루프 본문을 실행합니다.
두 번째 형태는 연관 배열(associative array)을 순회할 때 적합합니다. 매 반복마다 현재 요소의 키와 값이 각각 $key와 $value 변수에 담기고, 루프 본문이 실행된 후 포인터가 다음 키-값 쌍으로 이동하여 배열이 소진될 때까지 반복됩니다.
예제 1: 인덱스 배열 순회
아래 예제는 foreach 루프를 사용해 인덱스 배열의 각 요소에 2를 곱해 출력합니다.
<?php
$arr = array(2,4,6,8,10);
foreach ($arr as $i){
echo $i . "*2=" . $i*2 . "\n";
}
?>실행 결과:
2*2=4 4*2=8 6*2=12 8*2=16 10*2=20
예제 2: 연관 배열 순회
다음 예제는 과목명을 키로, 점수를 값으로 가지는 연관 배열을 foreach 루프로 순회합니다.
<?php
$arr = array("Phy"=>50, "Che"=>60, "Maths"=>70, "Bio"=>80);
foreach ($arr as $sub=>$marks){
echo "marks in $sub: " . $marks . "\n";
}
?>실행 결과:
marks in Phy: 50 marks in Che: 60 marks in Maths: 70 marks in Bio: 80
예제 3: 중첩 foreach로 2차원 배열 순회
2차원 배열은 중첩(nested) foreach 루프를 사용해 순회할 수 있습니다. 바깥쪽 루프가 각 행(row)을 가져오고, 안쪽 루프가 해당 행의 각 열(column) 값을 처리합니다.
<?php
$arr1=[1,2,3,4,5];
$arr2=[6,7,8,9,10];
$twodim=[$arr1,$arr2];
foreach ($twodim as $row){
foreach ($row as $col){
echo $col . " ";
}
echo "\n";
}
?>실행 결과:
1 2 3 4 5 6 7 8 9 10
예제 4: 연관 배열로 이루어진 2차원 배열 순회
연관 배열들이 모인 2차원 배열 역시 중첩 foreach로 손쉽게 순회할 수 있습니다. 아래 예제는 학생별 정보(번호, 이름, 점수)를 담은 연관 배열 여러 개를 하나의 배열로 묶어 처리합니다.
<?php
$arr1=["rno"=>1, "name"=>"Kiran", "marks"=>50];
$arr2=["rno"=>2, "name"=>"anil", "marks"=>60];
$arr3=["rno"=>3, "name"=>"Bina", "marks"=>70];
$twodim=[$arr1,$arr2, $arr3];
foreach ($twodim as $row){
foreach ($row as $k=>$v){
echo $k . ":" . $v . " ";
}
echo "\n";
}
?>실행 결과:
rno:1 name:Kiran marks:50 rno:2 name:anil marks:60 rno:3 name:Bina marks:70
참조(&)로 배열 요소 직접 수정하기
foreach 루프 안에서 원본 배열의 값을 변경하고 싶다면 변수 앞에 &(앰퍼샌드)를 붙여 참조(reference)로 전달하면 됩니다. 이 경우 복사본이 아닌 실제 배열 요소가 수정됩니다. 단, 루프가 끝난 후에는 unset()으로 참조 변수를 반드시 해제하는 것이 안전합니다.
<?php
$arr = [1, 2, 3];
foreach ($arr as &$v){
$v *= 2;
}
unset($v); // 참조 해제
print_r($arr);
?>실행 결과:
Array
(
[0] => 2
[1] => 4
[2] => 6
)정리
foreach 루프는 PHP에서 배열을 다룰 때 가장 직관적이고 안전한 반복 방법입니다. 인덱스 배열은 값만, 연관 배열은 키와 값을 함께 꺼내 쓸 수 있으며, 중첩 루프를 활용하면 2차원 배열이나 JSON처럼 계층화된 데이터 구조도 손쉽게 처리할 수 있습니다. 배열 요소를 수정해야 하는 경우에는 참조(&) 문법을 활용하면 됩니다.