2013-08-13 1 views
0

약 300 개의 항목이있는 배열이 있습니다. 항목 당 5 개의 속성이 있습니다. 일부 항목에는 상위 항목이 있습니다. 중첩 된 항목은 무제한 중첩으로 확장 할 수 있어야합니다.연관 배열을 사용하여 단일 최상위가없는 트리를 만드는 방법

부모가있는 모든 항목이 상위 항목 children 속성 내에 있도록 배열을 구성해야합니다. childchildren

첫 번째 2 레벨을 만드는 연관 배열을 만들 수 있습니다. 상위 상위 항목과 하위 항목입니다.

내 문제는 무제한 중첩을 만들려고 할 때 발생합니다. 여러 중첩 수준에 적응하고 중첩되어야하는 위치에 정보를 넣을 메서드를 자동으로 만드는 방법을 볼 수 없습니다.

나는 그런 나무를 만들 필요가 없었으며 성능이 중요했습니다. 누구든지 내가 성취하고자하는 것을 어떻게 달성 할 수 있는지에 대한 지침을 줄 수 있습니까? 정말 고마워요

편집 : 내 문제는 재귀를 사용하는 방법, 내가 어떻게 막 분리 된 1 별도의 방법으로하는 경우입니다.

$tree = array(); 
      /* 
      * $three = array(array('id','parent_id','displayAs', 'children')) 
      */ 
      foreach ($taxonomyFullList as $firstLevel) { 

       // Get all 
       if((int)$firstLevel['parent_id'] == 0) { 
        $tree[] = array( 
            'id' => $firstLevel['id'], 
            'parent_id' => $firstLevel['parent_id'], 
            'displayAs' => $firstLevel['displayAs'], 
            'type' => $firstLevel['type'], 
            'children' => array() 
            ); 
        $key = array_search($firstLevel,$taxonomyFullList); 
        unset($taxonomyFullList[$key]); 
       } 
      } 

      foreach ($taxonomyFullList as $secondLevel) { 
       foreach ($tree as $firstTreeLevel) { 
        if((int)$secondLevel['parent_id'] === (int)$firstTreeLevel['id']) { 

         $newArray = array( 
            'id' => $secondLevel['id'], 
            'parent_id' => $secondLevel['parent_id'], 
            'displayAs' => $secondLevel['displayAs'], 
            'type' => $secondLevel['type'], 
            'children' => array() 
            ); 
         $key = array_search($firstTreeLevel, $tree); 
         array_push($tree[$key]['children'], $newArray); 

         $taxonomyFullListKey = array_search($secondLevel,$taxonomyFullList); 
         unset($taxonomyFullList[$taxonomyFullListKey]); 
        } 
       } 

      } 
+1

내가 그 물건을 할 것 같아요/8840319/build-a-tree-from-a-flat-array-in-php? rq = 1 –

답변

0

그것은 당신의 데이터에 의존하지만 당신은 아마 어딘가에 재귀를 사용해야합니다. 먼저 하나의 항목을 채우는 기능을 작성하십시오.이 항목에 하위 기능이있는 경우 동일한 기능을 다시 사용하십시오.

기본적으로, 당신은 다음과 같이 뭔가를해야합니다 :이 링크는 중첩 된 세트 모델을 사용하여 MySQL의에서 계층 적 데이터를 관리하는 방법을 보여줍니다

function createItem() { 
    $item = array(); 
    // ... 
    // populate the item properties 
    // ... 
    $item['children'] = createItem(); 
    return $item; 
} 

$root = createItem(); 
+0

그래, 지금까지 내가 처음 논리에서했던 것 (다른 방법으로 그것을 분리하지 않았다. 그러나 나는 그것을 얻는다). 내 문제는 더 중첩 된 레벨에서 재귀를 사용해야 할 때입니다. –

+0

Jonathan Thurft를 생각하지 않습니다. 이것은 건전한 조언 IMO입니다. – allen213

+0

@ allen213 문제는 하나의 최상위 항목이 없다는 것입니다. id = 0 일 것이므로 최상위 레벨이 될 많은 항목이 있습니다. 그 예제는 1 개 이상의 항목을 허용하기 위해 array_push를 사용하지 않습니다. –

관련 문제