2009-10-22 3 views
1

좋아요, 기본적으로 모든 데이터 구조를 완벽하게 정렬 한 데이터 집합을 반환하는 mySQL 쿼리를 만들었습니다. 나는 그것을 선언했다 경우는 다음과 같이 보일 것입니다 :PHP 중첩 된 세트 모델 플랫 배열에서 다차원 배열 만들기

내가 원하는 무엇
$arr = array(
     array('name' => 'Root', 'depth' => 0), 
     array('name' => 'Food', 'depth' => 0), 
     array('name' => 'Fruit', 'depth' => 1), 
     array('name' => 'Bannnanna', 'depth' => 2), 
     array('name' => 'Apple', 'depth' => 2), 
     array('name' => 'Bannnanna', 'depth' => 2), 
     array('name' => 'Meat', 'depth' => 1), 
     array('name' => 'Furniture', 'depth' => 0) 
     ); 

, 나는 다시 다차원 배열을 얻을 수 있도록하는 방법으로이 $의 편곡을 공급하는 것입니다.

예를 들어 Fruit은 Food의 하위 항목입니다. 바나나나는 과일의 자손이 될 것입니다. 각 '자녀'의 키가 '페이지'가되어야합니다.

위에서 설명한 배열은 'lft'및 'rgt'와 같은 다른 정보도 반환 할 수 있습니다. 'parentId'가 설정되어 있지 않지만 필요한 경우 내 모델을 변경할 수 있지만 중첩 세트 모델을 고수하기를 원합니다. 이 같은

답변

4

다음 코드는 값의 순서와 깊이가 정확하다고 가정합니다. 키를 사용하여 중복을 제거합니다.

header('Content-Type: text/plain'); 

$arr = array(
    array('name' => 'Root', 'depth' => 0), 
    array('name' => 'Food', 'depth' => 0), 
    array('name' => 'Fruit', 'depth' => 1), 
    array('name' => 'Bannnanna', 'depth' => 2), 
    array('name' => 'Apple', 'depth' => 2), 
    array('name' => 'Bannnanna', 'depth' => 2), 
    array('name' => 'Meat', 'depth' => 1), 
    array('name' => 'Furniture', 'depth' => 0) 
); 

function process(&$arr, &$prev_sub = null, $cur_depth = 0) { 
    $cur_sub = array(); 
    while($line = current($arr)) { 
    if($line['depth'] < $cur_depth) { 
    return $cur_sub; 
    } elseif($line['depth'] > $cur_depth) { 
    $prev_sub = process($arr, $cur_sub, $cur_depth + 1); 
    } else { 
    $cur_sub[$line['name']] = $line['name']; 
    $prev_sub =& $cur_sub[$line['name']]; 
    next($arr); 
    } 
    } 
    return $cur_sub; 
} 

$values = process($arr); 
print_r($values); 

는 출력 : 참고 문헌으로 반환하는 방법을 정말 알아낼 수

Array 
(
    [Root] => Root 
    [Food] => Array 
     (
      [Fruit] => Array 
       (
        [Bannnanna] => Bannnanna 
        [Apple] => Apple 
       ) 
      [Meat] => Meat 
     ) 
    [Furniture] => Furniture 
) 
+0

이것은 정확하게 내가 찾고 있었던 것입니다. 훌륭한 작품입니다! 그래도 필드를 추가하는 방법을 게시 할 수 있습니까? – dzm

5

뭔가 어쩌면

  $arr = array(
        array('name' => 'Root', 'depth' => 0), 
        array('name' => 'Food', 'depth' => 0), 
        array('name' => 'Fruit', 'depth' => 1), 
        array('name' => 'Bannnanna', 'depth' => 2), 
        array('name' => 'Apple', 'depth' => 2), 
        array('name' => 'Bannnanna', 'depth' => 2), 
        array('name' => 'Meat', 'depth' => 1), 
        array('name' => 'Furniture', 'depth' => 0) 
        ); 

      $p = array(array()); 
      foreach($arr as $n => $a) { 
       $d = $a['depth'] + 1; 
       $p[$d - 1]['children'][] = &$arr[$n]; 
       $p[$d] = &$arr[$n]; 
      } 

      print_r($p[0]); 
+0

당신은 foreach는 코드를 설명 할 수주세요! 감사합니다 –

+0

@ 레이크스, 무엇이 바뀌 었습니까? – mattalxndr

+0

죄송합니다. mattalexx : 나는이 질문에 대해 더 이상 묻지 못합니다. – Layke