我遇到一个递归函数的问题,它需要太多资源才能在下拉列表中显示子父关系。例如:
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;
}
请给我建议,以便在选择框中将数据显示为子父关系的最佳解决方案。 提前谢谢!
答案 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