foreach 반복문은 다른 제어문과 달리 배열에만 동작합니다. 배열에 속한 키(key)와 원소(value)를 쉽게 분리할 수 있을 뿐 아니라 배열의 원하는 원소를 변수로 가져올 수 있습니다.
어렵게 증가, 감소와 같은 제어 변수나 break 문을 이용하지 않아도 되며, 다차원 배열이나 중첩에도 사용할 수 있습니다.
foreach (array_expression as value) {
statement;
}
foreach (array_expression as key => value) {
statement;
}
두 가지 문법 중 첫 번째 문법은 배열의 원소만 가져오고, 두 번째 문법은 키(key)와 원소(value)를 가져 옵니다. 이 중 첫 번째 문법이 더 자주 사용됩니다.
아래 예제는 첫 번째 문법을 사용한 것인데, $value 앞에 "&"를 붙여서 다른 $arr 배열원소에 참조가 가능합니다.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
unset($value);
var_export($arr);
?>
다음은 다차원 배열을 중첩하여 원소(value)로 분리한 예입니다.
<?php
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
$b = array();
foreach ($a as $v1) {
foreach ($v1 as $v2) {
$b[] = "$v2\n";
}
}
var_export($b);
?>
아래는 키(key)와 원소(value)를 분리한 예입니다.
<?php
$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "$k => $v.\n";
}
?>
다음 예도 기능적으로 동일하다는 것을 알 수 있습니다.
<?php
$arr = array("하나", "둘", "셋");
reset($arr);
while (list(, $value) = each($arr)) {
echo "while 값: $value\n";
}
foreach ($arr as $value) {
echo "foreach 값: $value\n";
}
?>
if, while, for 제어문과 마찬가지로 foreach 문도 동일하게 아래 표현방식을 사용할 수 있습니다.
foreach (array_expression as $value) {
statement;
}
foreach (array_expression as $value)
statement;
foreach (array_expression as $value):
statement;
endforeach;
다른 함수나 제어문 앞에 @를 붙여서 에러 출력을 감출 수 있지만 foreach 문만은 에러 출력을 제어하지 못하기 때문에 아래 방법으로 감출 수 있습니다.
<?php
$arr = null;
if(is_array($arr)) {
foreach ($arr as $value) {
echo "값: $value\n";
}
}
?>