2013-04-24 156 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,创建新的水平。