儿童父母关系的递归表

时间:2013-04-24 07:38:54

标签: php mysql codeigniter pyrocms

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在您的情况下,Home 1,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