2009-10-29 3 views
0

나는 바이너리 mlm 시스템을 사용하는 사이트에서 작업 해왔다. 레벨을 재귀 적으로 정렬

Illustration here

그래서 나는 데이터베이스에 두 개의 테이블을 가지고, 사용자는 관계를 ANAD. 사용자에게는 ID 및 개인 데이터 열이 있습니다. 관계에는 ID, parentID, childID, pos의 4 개의 열이 있습니다. 여기서 pos는 왼쪽 또는 오른쪽 중 하나입니다.

필자는 주어진 pid (parentID)의 모든 자식을 재귀 적으로 나열하는 함수를 성공적으로 작성했습니다. 그러나 수준 (표시 및 계산 목적) 정렬해야합니다. 이제

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [parentID] => 1 
      [pos] => l 
     ) 

    [1] => Array 
     (
      [id] => 4 
      [parentID] => 2 
      [pos] => l 
     ) 

    [2] => Array 
     (
      [id] => 8 
      [parentID] => 4 
      [pos] => l 
     ) 

    [3] => Array 
     (
      [id] => 5 
      [parentID] => 2 
      [pos] => p 
     ) 

    [4] => Array 
     (
      [id] => 3 
      [parentID] => 1 
      [pos] => p 
     ) 

    [5] => Array 
     (
      [id] => 6 
      [parentID] => 3 
      [pos] => l 
     ) 

    [6] => Array 
     (
      [id] => 7 
      [parentID] => 3 
      [pos] => p 
     ) 

) 

내가라는 이름의 함수 get_levels이 다음과 같아야한다는 다차원 배열 반환 :

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [id] => 2 
        [parentID] => 1 
        [pos] => l 
       ) 

      [1] => Array 
       (
        [id] => 3 
        [parentID] => 1 
        [pos] => p 
       ) 

     ) 
    [1] => Array 
     (
      [0] => Array 
       (
        [id] => 4 
        [parentID] => 2 
        [pos] => l 
       ) 

      [1] => Array 
       (
        [id] => 5 
        [parentID] => 2 
        [pos] => p 
       ) 
      [2] => Array 
       (
        [id] => 6 
        [parentID] => 3 
        [pos] => l 
       ) 

      [3] => Array 
       (
        [id] => 7 
        [parentID] => 3 
        [pos] => p 
       ) 

     ) 
    ETC. 

) 

여기를

나는 사용자 ID의 아이의 배열 = 1이 기능 :

function get_levels($pid,$level, $level_id){ 
     $children = children_array($pid,1); 
     if (sizeof($children) > 0): 
      foreach ($children as $child): 
      if ($child["parentID"] == $pid): 


       get_levels($child["id"], $level, $level_id+1); 
       $level[$level_id][] = $child;   


     endif; 


     endforeach; 
     endif; 
     return $level; 
} 

기능 chi ldren_array ($ pid, $ depth)는 children을 반환합니다. $ depth = 1은 바로 밑의 자식 (0 또는 1 또는 2)을 반환하고, $ depth = 0은 모든 자식을 반환합니다.

누구든지이 문제를 해결할 수 있습니까? 기능? 그러나 함수가 작동한다고 생각합니다. 재귀 적으로 배열을 사용하고 추가하는 방법을 모르겠습니다.

답변

0

잘못된 컨텍스트 내에서 데이터 구조를 사용하고있는 것 같습니다. 이것은 이진 트리이지만, 그것의 경계와 사용 규칙을 간단하게 정의하지는 않은 다중 레벨 배열로 표현됩니다.

트리를 사용할 때 왼쪽과 오른쪽에 두 개의 자식이있는 Node 클래스와 같은 것을 사용합니다. 나무를 따라 반복하면 케이크 조각이됩니다. 삽입/삭제/편집은 따라야 할 규칙 집합에 따라 쉽게 수행됩니다. 트리를 저장할 때 관계형 데이터베이스에서 쉽게 수행 할 수있는 Ahnentafel list을 사용합니다.

저장소 규칙을 변경하면 반복 규칙을 변경해야하거나 그 반대의 경우도 있으므로 반복 및 저장 프로세스를 혼용하지 않아야합니다.

+1

이 이진 트리 클래스를 발견했습니다 : http://www.phpclasses.org/browse/file/11713.html 데이터를 데이터베이스에 저장하는 가장 좋은 방법은 무엇입니까? ID | parentID | leftChildID | rightChildID? – Smaug

+0

데이터의 경우 상위를 참조해야하며 다른 방법이없는 경우 해당 위치를 참조하십시오. 부모가없는 노드가 루트입니다. –