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); // $value변수는 필요가 없으므로 삭제를 합니다. 
 var_export($arr); 

 /* 
  결과: 
  array ( 
  0 => 2, 
  1 => 4, 
  2 => 6, 
  3 => 8, 
 ) 
 */ 
 ?>

다음은 다차원 배열을 중첩하여 원소(value)로 분리한 예입니다.

<?php 
 $a = array(); 
 $a[0][0] = "a"; 
 $a[0][1] = "b"; 
 $a[1][0] = "y"; 
 $a[1][1] = "z"; 
 $b = array(); // 배열을 분리, $b변수에 작성하기 위해 초기화합니다. 

 foreach ($a as $v1) { // $a배열이 이차원 배열이므로 foreach가 두번 작성됩니다. 
    foreach ($v1 as $v2) { 
        $b[] =  "$v2\n"; 
    } 
 } 
 var_export($b); 

 /* 
 결과:  
 array ( 
  0 => 'a', 
  1 => 'b', 
  2 => 'y', 
  3 => 'z', 
 )  
 */ 
 ?>

아래는 키(key)와 원소(value)를 분리한 예입니다.

<?php 
 $a = array( 
    "one" => 1, 
    "two" => 2, 
    "three" => 3, 
    "seventeen" => 17 
 ); 

 foreach ($a as $k => $v) { 
    echo "$k => $v.\n"; 
 } 
 /* 
 결과: 
 one => 1. 
 two => 2. 
 three => 3. 
 seventeen => 17. 
 */ 
 ?>

다음 예도 기능적으로 동일하다는 것을 알 수 있습니다.

<?php 
 $arr = array("하나", "둘", "셋"); 
 reset($arr); 

 while (list(, $value) = each($arr)) { 
    echo "while 값: $value\n"; 
 } 

 foreach ($arr as $value) { 
    echo "foreach 값: $value\n"; 
 } 

 /* 
 결과: 
 while 값: 하나
 while 값: 둘
 while 값: 셋

 foreach 값: 하나
 foreach 값: 둘
 foreach 값: 셋
 */ 
 ?>

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"; 
     } 
 } 
 ?>

0 댓글