PHP 4는 펄이나 다른 언어처럼 foreach구문을 지원합니다. 이런 구문은 간단하게 배열에 대한 작업을 수행하는 가장 쉬운 기법입니다. foreach는 배열에서만 작동하고 다른 데이터형을 갖는 변수나 초기화되지 않은 변수에 대해서 이 구문을 사용하려한다면 에러 메시지를 만날것입니다. 이 구문은 두가지 문법이 있습니다; 두번째보다는 첫번째문법이 더 유용한 사용법입니다:
foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement
첫번째 형태는 array_expression에서 주어진 배열에 대해 루프를 돈다. 각 루프에서 현재 배열 원소의 값은 $value 로 지정되고 내부적인 배열 포인터는 하나씩 이동하게 된다 (그래서 다음 루프에서 다음 배열 원소를 보게 될것이다)
두번째 루프도 같은 일을 한다. 단 현재 배열 원소의 키(key)값은 각 루프의 $key변수로 지정된다.
PHP 5부터 객체 순환도 할 수 있습니다.
Note: foreach문이 처음 실행할때, 내부적인 배열 포인터는 자동적으로 배열의 첫번째 원소로 리셋된다. 따라서 foreach절 이전에 reset()함수를 호출할 필요는 없다.
Note: 배열이 참조되지 않는 이상, foreach는 지정한 배열 자체가 아닌 복사한 배열을 대상으로 작동합니다. foreach는 배열 포인터에 영향이 있습니다. foreach 도중이나 이후에는 리셋하지 않은 배열 포인터에 의존하지 마십시오.
PHP 5부터, $value 앞에 &를 붙여서 배열 원소를 쉽게 변경할 있습니다. 값을 복사하지 않고 참조합니다.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr은 이제 array(2, 4, 6, 8)입니다.
unset($value); // 마지막 원소로 참조를 제거합니다.
이는 반복할 배열을 참조할 수 있을 때(즉, 변수)만 가능합니다.
$value 참조와 마지막 배열 원소는 foreach 루프 뒤에도 남아 있습니다. unset()으로 제거하는 것을 권합니다.
Note: foreach는 '@'를 사용해서 에러메시지를 출력하지 못하도록 할 수 없습니다.
다음 예는 기능적으로 동일하다는것을 알 필요가 있다:
<?php
$arr = array("하나", "둘", "셋");
reset($arr);
while (list(, $value) = each($arr)) {
echo "값: $value<br />\n";
}
foreach ($arr as $value) {
echo "값: $value<br />\n";
}
?>
다음 예도 기능적으로 동일하다:
<?php
$arr = array("하나", "둘", "셋");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "키: $key; 값: $value<br />\n";
}
foreach ($arr as $key => $value) {
echo "키: $key; 값: $value<br />\n";
}
?>
더 많은 예제 코드들이 사용법에 대해서 설명해준다:
<?php
/* foreach 예제 1: 값만 */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "\$a의 현재 값: $v.\n";
}
/* foreach 예제 2: 값 (표시를 위해 수동으로 접근 순서를 출력) */
$a = array(1, 2, 3, 17);
$i = 0; /* 가상 목적으로만 사용 */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* foreach 예제 3: 키와 값 */
$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* foreach 예제 4: 다차원 배열 */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* foreach 예제 5: 동적 배열 */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>