2013-04-24 194 views
1

我有一個遞歸函數的問題,需要太多的資源才能在下拉列表中顯示子父母關係。例如:遞歸表子女父母關係

home 
-menu 1 
-menu 2 
home 1 
-menu 3 
-menu 4 

我寫對數據庫每次遞歸調用一些代碼,所以這就是爲什麼我的代碼需要這麼多的資源來運行的原因。

下面是我的代碼:

--call遞歸

$tmp = $this->get_nav_by_parent(0); 
$a_sel = array('' => '-Select-'); 
$a_sel_cat = array('home' => 'home'); 
$this->get_child_nav_cat($tmp, 0, $a_sel); 

-

public function get_nav_by_parent($parent) { 
     $all_nav = $this->db 
       ->select('id, title, parent') 
       ->where('parent',$parent) 
       ->order_by('position') 
       ->get('navigation_links') 
       ->result_array(); 

     $a_tmp = array(); 
     foreach($all_nav as $item) 
     { 
      if($parent != 0){ 
       $item['title'] = '--' . $item['title']; 
      } 
      $a_tmp[] = $item; 
     } 
     return $a_tmp; 
    } 

- 遞歸函數

public function get_child_nav_cat($a_data, $parent, &$a_sel) { 

     foreach($a_data as $item) { 
      $a_sel[$item['page_slug_key']] = $item['title']; 
      $atmp = $this->get_nav_by_parent($item['id']); 
      $this->get_child_nav_cat($atmp, $item['id'], $a_sel);   
     } 
     return $a_sel; 
    } 

請給我您的建議最好的解決方案在選擇框中將數據顯示爲子父母關係。 在此先感謝!

+0

請檢查我的回答希望這將幫助你。 – Roopendra 2013-04-24 09:32:57

回答

0

顯示父子關係的最佳方法是在數據庫中使用mentain父和子標誌,而不是使用循環獲取值的 。

在你的情況家庭,家庭1是父母的國旗和菜單屬於兒童國旗。

從數據庫獲取數據和你的循環是這樣的: -

$arr = array(0 => array('name' => 'home','parent' => 0), 
    1 => array('name' => 'menu 1 ','parent' => 1), 
    2 => array('name' => 'menu 2 ','parent' => 1), 
    3 => array('name' => 'home 1','parent' => 0), 
    4 => array('name' => 'menu 3 ','parent' => 2), 
    5 => array('name' => 'menu 4','parent' => 2) 
); 

    $dd_html = '<select>'; 
    foreach($arr as $k => $v){ 
     if($v['parent'] == 0) 
      $dd_html .='<option>'.$v['name'].'</option>'; 
     else 
      $dd_html .='<option>--'.$v['name'].'</option>'; 
    } 

    $dd_html .= '</select>'; 

    echo $dd_html; 

輸出: -

home 
-menu 1 
-menu 2 
home 1 
-menu 3 
-menu 4 
+0

它運作良好。感謝您的解決方案 – nvtthang 2013-05-02 07:33:39

+0

您的歡迎@nvtthang。 :) – Roopendra 2013-05-02 08:13:56

0

集​​用於檢測根項目 然後執行此:
SELECT * FROM table ORDER BY ParentID, ID
然後通過遍歷結果和時變的parentID,創建新的水平。