2014-09-05 3 views
1

나는 비슷한 질문을했고 대답을 찾지 못했습니다 (here). 이것은 내가 바라는 더 간단한 질문입니다.다차원 배열을 통해 모든 경로를 얻는 방법

각 고유 값 집합을 여기에서 찾고 싶습니다. 그것은 평평한 배열처럼 보이지만 부모 정보를 어떻게 유지합니까? 이 트리의 답변은

45, 3, 88
45, 2, 77
45, 5, 67, 2, 35
45, 5, 67, 3, 44

$tree = [ 
    0 => '45', 
    1 => [ 
     0 => [ 
      0 => '3', 
      1 => [ 
        0 => [0 => '88'], 
       ], 
      ], 
     1 => [ 
      0 => '2', 
      1 => [ 
        0 => [ 0 => '77'], 
       ], 
      ], 
     2 => [ 
      0 => '5', 
      1 => [ 
       0 => [ 
        0 => '67', 
        1 => [ 
         0 => [ 
          0 => '2', 
          1 => [ 
           0 => [ 0 => '35' ], 
           ], 
          ], 
         1 => [ 
          0 => '3', 
          1 => [ 
           0 => [ 0 => '44' ], 
           ], 
          ], 
         ], 
        ], 
       ], 
      ], 
     ], 
    ]; 
+0

당신이 공유 할 수있는 작업 너는 노력 했어. 우리가 목표 달성에 미치지 못하는 곳에 우리를 데려다 줄까요? –

+0

가능한 복제본 [배열과 같은 트리를 통과하여 PHP에서 최대 범위를 찾습니다] (http://stackoverflow.com/questions/25650175/traverse-a-tree-like-array-to-find-maximum-span-in- PHP) –

답변

2

개인적으로, 나는 더 쉽게 삶을 살기 위해 array('45'=>array('3'=>...),...);과 같은 소스 구조를 평평하게 만들었지 만, 각자 자신의 것으로 생각합니다.

function traverse($arr, &$return, $path=NULL) { 
    // track the current path through the tree 
    $path[] = $arr[0]; 
    if(isset($arr[1]) && is_array($arr[1])) { 
     // descend through each branch 
     foreach($arr[1] as $i) { 
      traverse($i,$return,$path); 
     } 
    } else { 
     // store path each time we reach a leaf 
     $return[] = $path; 
    } 
} 

traverse($tree, $return); 
var_dump($return); 

출력 :

array(4) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(2) "45" 
    [1]=> 
    string(1) "3" 
    [2]=> 
    string(2) "88" 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    string(2) "45" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(2) "77" 
    } 
    [2]=> 
    array(5) { 
    [0]=> 
    string(2) "45" 
    [1]=> 
    string(1) "5" 
    [2]=> 
    string(2) "67" 
    [3]=> 
    string(1) "2" 
    [4]=> 
    string(2) "35" 
    } 
    [3]=> 
    array(5) { 
    [0]=> 
    string(2) "45" 
    [1]=> 
    string(1) "5" 
    [2]=> 
    string(2) "67" 
    [3]=> 
    string(1) "3" 
    [4]=> 
    string(2) "44" 
    } 
} 
0

이 약간 다른 구현은, 각각의 반복은 그 하위 경로를 반환하고 발신자의 데이터를 수정하지 않습니다.

이 함수는 트리를 깊이 조사하여 열거로 가능한 모든 경로를 생성합니다. 각 창에서 현재 노드가

9 => (5, 7 => 3) 

은 ((5), (7, 3))를 수신하고 ((9, 5), (9로 확장 아이의 경로를 미리 결정되므로

되고 7, 3)), 호출자에게 거꾸로 을 전달합니다

나는 단지 공급 나무로 테스트
function enumerateArray($arr) { 
    if (1 == count($arr)) { 
     // Leaf: one path only is possible, and it has $arr[0]. 
     return [ $arr ]; 
    } 
    // This node will prefix all the paths of its children. 
    list($node, $children) = $arr; 
    $paths = [ ]; 
    foreach ($children as $child) { 
     // Get all the paths of this child 
     foreach(enumerateArray($child) as $subpath) { 
      // Add the path, with prefix, to possible paths 
      array_unshift($subpath, $node); 
      $paths[] = $subpath; 
     } 
    } 
    return $paths; 
} 

, 당신은 병적 인 경우에 대해 확인 할 수 있습니다 :

print_r(
    array_map(
     function($path){ 
      return implode(', ', $path); 
     }, 
     enumerateArray($tree) 
    ) 
); 

Array 
(
    [0] => 45, 3, 88 
    [1] => 45, 2, 77 
    [2] => 45, 5, 67, 2, 35 
    [3] => 45, 5, 67, 3, 44 
) 
관련 문제