1

我有一个递归函数的问题,它需要太多资源才能在下拉列表中显示子父关系。例如:

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

我每次都为递归调用数据库编写了一些代码,这就是为什么我的代码需要大量资源来运行的原因。

下面是我的代码:

--调用递归

$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;
   }

请给我建议,以便在选择框中将数据显示为父子关系的最佳解决方案。提前致谢!

4

2 回答 2

0

显示父子关系的最佳方法是在数据库中保留父子标志,而不是使用循环获取值。

在您的情况下,Home 1 是父标志,菜单属于子标志。

从 db 获取数据,您的循环如下所示:-

$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
于 2013-04-24T08:31:38.620 回答
0

设置ParentID=0为检测根项目然后执行以下操作:
SELECT * FROM table ORDER BY ParentID, ID
然后遍历结果,当 ParentID 更改时,创建新级别。

于 2013-04-24T08:19:54.710 回答