2012-06-07 4 views
8

지금까지 다차원 배열을 반복해야한다면 각 차원마다 foreach 루프를 사용합니다. 두 가지 차원깊이를 알지 못하고 다차원 배열을 반복 할 수 있습니까?

foreach($array as $key=>$value) 
{ 
    foreach($value as $k2=>$v2) 
    { 
     echo 
    } 
} 

내가 배열의 깊이를 모를 때 어떻게해야합니까에 대한

예컨대? 즉, 깊이는 가변적이다.

내가 생각할 수있는 유일한 점은 루프의 전체 스택을 코딩하고 다음 값이 배열이 아닌 경우 루프를 중단하는 것입니다. 이것은 약간 어리석은 것처럼 보입니다.

더 좋은 방법이 있습니까?

답변

16

예, recursion을 사용할 수 있습니다. 재귀을하는 것은 당신이 어떤 깊이를 가지 않을 것 기본 케이스이 필요하다는 때

function printAll($a) { 
    if (!is_array($a)) { 
    echo $a, ' '; 
    return; 
    } 

    foreach($a as $v) { 
    printAll($v); 
    } 
} 

$array = array('hello', 
       array('world', 
        '!', 
        array('whats'), 
        'up'), 
       array('?')); 
printAll($array); 

당신이 항상 기억해야합니까 : 여기에 배열을 출력 모든 요소가 예입니다.

나는이 기능을 계속하기 전에 기본 케이스를 확인하고 싶다. 이것은 일반적인 관용구이지만 꼭 필요한 것은 아닙니다. 재귀 호출을 출력하거나 재귀 호출을 수행해야한다면 foreach 루프를 체크인 할 수도 있지만 코드를 유지하는 것이 더 어려울 수 있습니다.

현재 입력과 기본 사례 간의 "거리"는 변형이며 정수입니다. 변형은 모든 재귀 호출에서 엄격하게 감소해야합니다. 앞의 예에서 변형은 the depth of $a입니다. 변형에 대해 생각하지 않으면 무한 재귀로 끝날 위험이 있으며 결과적으로 스크립트는 stack overflow으로 인해 죽을 것입니다. 재귀 함수 이전에 주석에 변종이 무엇인지 정확하게 기록하는 것은 드문 일이 아닙니다. array_walk_recursive 내부

+1

번호를 사용하여 내장을 array_walk_recursive(). PHP는 재귀에서 짜증납니다. –

0

이 문제에 대한 재귀를 사용할 수 있습니다 여기에

는 하나의 예

$array = array(1 => array(1 => "a", 2 => array(1 => "b", 2 => "c", 3 => array(1 => "final value")))); 

//print_r($array); 

printAllValues($array); 

function printAllValues($arr) { 
    if(!is_array($arr)) { 
     echo '<br />' . $arr; 
     return; 
    } 
    foreach($arr as $k => $v) { 
     printAllValues($v); 
    } 
} 

그것은

그것은처럼 인쇄 할 배열을 통해 루프로 재귀를 사용

a 
b 
c 
final value 
0

간단한 함수 중첩의 정도 및 키 값을 나타내 :

array_walk_recursive($array, function($v, $k) { 
           static $l = 0; 
           echo "Level " . $l++ . ": $k => $v\n"; 
          }); 

결과 얻을 수있는 참조 use를 나타내는 또 하나

array_walk_recursive($array, function($v) use(&$result) { 
           $result[] = $v; 
          }); 
관련 문제