2011-11-14 2 views
3
Array 
(

    [178] => Array 
     (
     ) 

    [179] => Array 
     (
      [180] => 
      [181] => 
      [182] => 
      [183] => 
     ) 

    [184] => Array 
     (
      [185] => 
     ) 

    [186] => Array 
     (
     ) 

    [189] => Array 
     (
      [190] => 
     ) 

    [181] => Array 
     (
      [191] => 
      [192] => 
     ) 

    [192] => Array 
     (
      [194] => 
     ) 

) 

이 PHP 배열은 모든 노드의 목록입니다. 나중의 조회를 위해 고유 한 mysql ID를 저장하기 위해 키를 사용했다. 두 번째 수준 배열의 일부 키가 첫 번째 수준과 동일 함을 알 수 있습니다. 하위 레벨이 재귀 적으로 상위 레벨에 합류하도록 배열에 가입하고 싶습니다.중첩 된 다차원 배열을 조작합니다.

예를 들어, 179 -> 181 -> 192 -> 194

많은 노드 수준이있을 수 있습니다 단지 내가이 예에서 무엇을. 모든 노드를 재귀 적으로 올바른 순서로 추가하려면 어떻게해야합니까?

업데이트 됨 또한 노드의 모든 끝, 즉 더 이상 노드가없는 ID의 배열이 있습니다.

배열 ( [0] => 178 [1] => 180 [2] => 182 [3] => 183 [4] => 185 [5] => 186 [6] => 190 [7] => 191 [8] => 194 )

+1

더 나은 db 쿼리가 원하는 데이터를 검색 할 것으로 의심됩니다. PHP에서 다시 실행해야합니다. –

+0

해당 작업에 대한 재귀 함수를 사용할 수 있습니다. – mario

+0

두 번째 수준의 노드는 첫 번째 수준과 동일합니까? – Homer6

답변

2

나는 이것이 당신이 찾고있는 긍정적 인 아니에요, 나는 많은 더 효율적인 방법이 확신 이것을하기 위해. 하지만 여기에 그것의 기회가 있습니다 :

당신이 위에서 언급 한 입력 예제를 감안할 때.

이 코드 :

function index_nodes($nodes, &$index) { 
    foreach($nodes as $key => $value) { 
     if ($value) { 
      $index[$key] = $value; 
      index_nodes($value, $index); 
     } 
    } 
} 

function nest_list($list) { 
    $index = array(); 
    index_nodes($list, $index); 

    // Construct tree 
    $build_tree = function(&$value, $key) use ($index, &$updated) { 
     if(array_key_exists($key, $index)) { 
      $value = $index[$key]; 
      $updated = true; 
     } 
    }; 

    // This needs done several times, since I can't be sure I nested things 
    // in the perfect order. 
    do { 
     $updated = false; 
     array_walk_recursive($list, $build_tree); 
    } while($updated); 

    return $list; 
} 

실행과 같이 :

$list2 = nest_list($list); 
print_r($list2); 

는 다음과 같은 출력을 제공합니다 : 다시 한번

Array 
(
    [178] => 
    [179] => Array 
     (
      [180] => 
      [181] => Array 
       (
        [191] => 
        [192] => Array 
         (
          [194] => 
         ) 
       ) 
      [182] => 
      [183] => 
     ) 
    [184] => Array 
     (
      [185] => 
     ) 
    [186] => 
    [189] => Array 
     (
      [190] => 
     ) 
    [181] => Array 
     (
      [191] => 
      [192] => Array 
       (
        [194] => 
       ) 

     ) 
    [192] => Array 
     (
      [194] => 
     ) 
) 

... 코드의 큰 더미를하지만, 내 생각 그것은 당신을 당신의 목표에 더 가깝게 만듭니다.

+0

아담, 정말 고마워! 나를 올바른 길로 인도했다.) – Justin