WebApp/PHP2010. 8. 12. 13:31
PHP에는 foreach구문 정의가 있어서 배열 반복을 더욱 쉽게 만들 수 있다. 이 방법이 기존 for구문과는 어떤 차이가 있는지 다음 예제를 통해 설명하고자 한다.

우선 for구문을 통한 배열 반복의 예다.
for($i=0; $i<count($array); $i++) {
echo("Index: ".$i."\t Value: ".$array[$i]."\n");
}
인덱스는 $i로 배열 값은 $array[$i]로 나타난다.

다음은 foreach구문을 통한 배열 반복의 예다.
foreach($array as $key => $value) {
echo("Index: ".$key."\t Value:".$value."\n");
}
인덱스는 $key로 배열 값은 $value로 나타낸다.

인덱스 값이 필요치 않은 경우 다음과 같이 단순화 할 수도 있다.
foreach($array as $value) {
echo("Value: $value \n");
}

foreach구문은 for구문과 동일한듯 하지만 몇 가지 차이점이 있다.
일단 좀더 선언구가 의미 있다. for구문은 선언문에 루프 메커니즘을 사용하지만, foreach구문은 루프 내에서 사용할 데이터를 정의하고 있다.
또한 배열의 모든 인덱스에 대하여 구문을 실행한다. for구문은 자동 배열(인덱스가 0,1,2,3..)에 한해서만 그 처리를 할 수 있다. (물론 소스를 복잡하게 해서 처리하도록 할 수는 있다.) 다음 예제를 통해 설명하겠다.

예를 들어 아래처럼 야구 순위 프로그램에 사용하는 배열이 있다고 하자.
$array = array(0=>"SK", 1=>"Samsung", 2=>"Doosan", 3=>"Lotte", 4=>"Kia", 5=>"LG", 6=>"Hanhwa", 7=>"Nexen", "From"=>"KBO", "Date"=>"20100812");

위 배열을 앞에서 소개한 for구문으로 실행하면 다음과 같은 결과가 나온다.
Index: 0    Value: SK
Index: 1    Value: Samsung
Index: 2    Value: Doosan
Index: 3    Value: Lotte
Index: 4    Value: Kia
Index: 5    Value: LG
Index: 6    Value: Hanhwa
Index: 7    Value: Nexen
Index: 8    Value:
Index: 9    Value:

count에서 알아낸 배열의 크기가 10이므로 10번의 루프는 돌았으나,
숫자를 순차적으로 증가시켜서 찾기 때문에 숫자 인덱스가 중간에 비어있는 배열(인덱스가 0,1,4,5..처럼 중간 숫자가 빠진 경우)이나 문자로 인덱스를 사용하는 배열(From, Date...)에 대해서는 예기치 못한 오류가 발생할 수 있는 것이다.

하지만 foreach구문을 사용하면 다음과 같이 정상적으로 처리할 수 있다.
Index: 0     Value: SK
Index: 1     Value: Samsung
Index: 2     Value: Doosan
Index: 3     Value: Lotte
Index: 4     Value: Kia
Index: 5     Value: LG
Index: 6     Value: Hanhwa
Index: 7     Value: Nexen
Index: From     Value: KBO
Index: Date     Value: 20100812

기능적으로 for구문이 뒤떨어진다고 해서 불필요한 것은 아니다.
앞의 예제처럼 순위 정보와 그에 관련한 정보를 배열 하나에 묶어 놓고, 순위 정보(숫자 인덱스)를 출력할 때에는 for구문을 이용하고 관련 정보(문자 인덱스)를 뽑을 때는 foreach구문을 이용하는 식의 활용을 할 수 있다. 이 방법은 여러 변수를 사용하지 않고 순위에 대한 것들을 변수 하나에 묶을 수 있기 때문에 매우 유용한 방법이다.


Posted by 마이클