■ foreach 문
foreach문은 배열에서만 작동한다. 배열이 아니면 php코드 내에 오류메시지를 출력한다. 다차원 배열이나 중첩도 가능하며, 키(key)와 원소(value)로 분리하거나 변수로 지정가능하다.
<?php // 첫번째 문법 foreach (array_expr as value) { statement; }
// 두번째 문법 foreach (array_expr as key => value) { statement; } ?>
|
두 가지 문법 중 첫 번째 문법은 배열의 원소만 가져오고, 두 번째 문법은 키(key)와 원소(value)를 가져온다. 이 중 첫 번째 문법이 더 유용할 것이다. 아래 예는제는 첫 번째 문법을 사용한 것인데, value앞에 "&"를 붙여서 다른 arr 배열원소로 참조 변경이 가능하다.
ex01.php
|
<?php $arr = array(1, 2, 3, 4);
foreach ($arr as &$value) { $value = $value * 2; }
var_export($arr); ?>
|
출력결과 |
|
다음은 다차원 배열을 중첩하여 원소(value)로 분리한 예입니다.
ex02.php
|
<?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"; } }
var_export($b); ?>
|
출력결과
|
|
아래큰 키(key)와 원소(value)를 분리한 예이다.
ex03.php |
<?php $a = array( "one" => 1 , "two" => 2 , "three" => 3 , "seventeen" => 17 );
foreach ($a as $k => $v) { echo "$k => $v<br/>"; } ?> |
출력결과 |
|
다음 예제도 기능적으로 동일하다.
ex04.php
|
<?php $arr = array("하나", "둘", "셋"); reset($arr);
while (list(, $value) = each($arr)) { echo "while 값 : $value<br/>"; }
echo "<hr/>";
foreach ($arr as $value) { echo "foreach 값 : $value<br/>"; } ?>
|
출력결과 |
|
if, while, for문과 마찬가지로 foreach문도 동일하게 아래 표현방식을 사용할 수 있다.
<? // 괄호 문법 foreach (array_expr as value) { statement; }
// 짤은 문법 foreach (array_expr as value) statement;
// 콜론 문법 foreach (array_expr as value) : statement; endforeach; ?>
|
변수가 배열이 아니면 php 오류를 표시하므로 다음 예제처럼 오류 출력을 제어할 수 있다.
ex05.php
|
<?php $arr = null;
if (is_array($arr)) { // 배열이면 실행합니다. foreach ($arr as $value) { echo "값 : $value<br/>"; } } ?>
|
ex06.php |
<?php $arr = null;
foreach ((array)$arr as $value) { echo "값 : $value<br/>"; } ?>
|
■ 다차원 배열 일괄처리 소스
_GET, _POST, _FILES 의 외부 배열 변수를 일괄 처리하는 함수이다.
ex07.php
|
<?php // 다음 _GET 변수를 일괄처리되게 합니다. $_GET['var1'] = 1; $_GET['var2'] = ""; $_GET['var3'] = null; $_GET['var4'] = "테스트입니다."; $_GET['var5']['ARG1'] = "ARG1"; $_GET['var5']['ARG2'] = "ARG2"; $_GET['var5']['ARG3']['ARG4'] = "3차배열"; $_GET['var5']['ARG3']['ARG5']['VAR'] = "4차배열"; $_GET['var5']['ARG4'] = "NULL"; $_GET['var5']['ARG5']['ARG6'] = "TEAT"; $_GET['var6'] = 2;
function replace_data($arg) { $get = array();
if(is_array($arg)) {
while(list($k,$v) = each($arg)) {
if(is_array($arg[$k])) {
while(list($k2,$v2) = each($arg[$k])) {
$get[$k][$k2] = $arg[$k][$k2]; replace_data($get[$k][$k2]); } } else {
// 일괄처리할 작업코드를 작성합니다. $get[$k] = $v; } } }
unset($_GET); // _GET 변수를 지워버림. return $get; } // end func
$get = replace_data($_GET);
print_r($get); print_r($_GET); // 결과: _GET 외부 변수는 지워 버렸으니 출력하지 않습니다.
/* 결과 : Array ( [var1] => 1 [var2] => [var3] => [var4] => 테스트입니다. [var5] => Array ( [ARG1] => ARG1 [ARG2] => ARG2 [ARG3] => Array ( [ARG4] => 3차배열 [ARG5] => Array ( [VAR] => 4차배열 ) ) [ARG4] => NULL [ARG5] => Array ( [ARG6] => TEAT ) ) [var6] => 2 ) */ ?>
|
출력결과
|
|