2017-04-27 61 views
0

可以說,我有一個具有水平的記錄,它表示一個樹層次結構表如何在PHP/CodeIgniter中構建多維嵌套數組?

id   group  parent_group_id 
--------- ---------- --------------- 
1   Parent 1 NULL 
2   Parent 2 NULL 
3   Parent 3 NULL 
4   Child 1  1 
5   Child 2  2 
6   Child 3  2 
7   Child 4  6 

我需要,使其在「頂」,由開始的目標是構建一個遞歸函數來構建一個多維嵌套數組首先構建parent_group_ids爲NULL的行的頂層數組。快進幾個迭代,即時通訊期待與像這樣

$result = array(
    [0] => array(
     'id' => 1, 
     'group' => 'Parent 1', 
     'parent_group_id' => NULL, 
     'children' => array(
      [0] => array(
       'id' => 4, 
       'group' => 'Child 1' 
       'parent_group_id' => 1, 
       'children' => NULL)), 
    [1] => array(
     'id' => 2, 
     'group' => 'Parent 2', 
     'parent_group_id' => NULL, 
     'children' => array(
      [0] => array(
       'id' => 5, 
       'group' => 'Child 2' 
       'parent_group_id' => 2, 
       'children' => NULL), 
      [1] => array(
       'id' => 6, 
       'group' => 'Child 3' 
       'parent_group_id' => 2, 
       'children' => array(
        [0] => array(
         'id' => 1, 
         'group' => 'Child 4' 
         'parent_group_id' => 6, 
         'children' => NULL))) 

什麼是要建立這樣的事情最好的辦法的目的是結束了?我需要確保它遍歷每個「分支」。我猜是什麼時候它獲得頂級父母的ID,然後繼續檢查是否存在具有等於來自第一次運行的每個ID的parent_group_id的行。然後,如果發現孩子,請獲取這些孩子的ID,然後再次檢查孩子是否存在。等等等等,直到它運行出ID來檢查。

我不熟悉foreach循環來拉出這樣的東西。

回答

1

看看這個源代碼。

我覺得這個函數有點類似於你所問的。

public function getAreaTree(array $elements, $parentId = null) { 
    $branch = array(); 

    foreach ($elements as $element) { 

     if ($element['parent_id'] == $parentId) { 

      $children = getAreaTree($elements, $element['id']); 

      if ($children) { 

       $element['children'] = $children; 

      } 

      $branch[] = $element; 
     } 

    } 

    return empty($branch) ? null : $branch; 
} 
+0

好吧,當我在所有的元素getAreaTree(初始調用)的result_array過去了,我得到的是前兩個頂級元素和沒有孩子/孫子 編輯:沒關係,我修改你的代碼重命名一些東西並錯過重命名。 –

0

你好,我曾在你尋找同樣的概念。

使用此代碼。這對我來說很有用。

function recursion($parent_id = '') { 
     $categories = array(); 
      $this->db->from('category'); 
      $this->db->where('parent_id', $parent_id); 
      $result = $this->db->get()->result_array(); 

      if(count($result) > 0) { 
       foreach ($result as $c) { 
       $child = $this->recursion($c['category_id']); 
       if($child) { 
        $c ['children']= $child; 
       } 
       $categories[] = $c; 
       } 
      } 
      return $categories; 

    } 

function get_cat() { 
      print_r($this->recursion()); 
    } 

這可以提高預加載所有類別的速度,從而跳過每個新的parent_id的查詢。

這個函數做了什麼:使用給定的parent_id加載所有類別,遍歷所有這些類別並遞歸地存儲數組。

但問題是,這迫使你有一個乾淨的樹形結構你的類別。

希望它能幫助你解決你的問題。