所以我有一个菜单表,id,title,parent_id
我已将一些内容字段附加到菜单的最底层(假设id = 50),那么如果我点击该树菜单的顶部父菜单(id = 1),我希望它显示内容附在孩子菜单上(无论多深),所以我想我需要循环通过父母,你能帮助我解决这个问题吗?
$data['query'] = $this->item_model->getByType($menu_id);
function getByType($menu_id) {
if($menu_id) {
$q = $this->db->get_where('menus', array('id' => $menu_id));
$parent_id = $q->row()->parent_id;
}else{
return;
}
$this->db->select('*');
$this->db->from('items');
$this->db->where('menu_id', $menu_id);
$this->db->or_where('menu_id', $parent_id);
$query = $this->db->get();
return $query;
}
所以到现在为止我只得到一些菜单,如果我点击他的父级(2级),但是如何让它无限级别的深度?,我想在这里我需要放入一个循环{{ 1}},你能帮帮我吗?
答案 0 :(得分:2)
Hmz ...... Recursion!
function getChildrenAttachments($menu_id) {
// invalid menu id
if(!$menu_id) return;
// get all rows with this parent id
$query = $this->db->get_where('menus', array('parent_id' => $menu_id));
// result will hold all the attachments
$result = array();
// loop through results
foreach($query->result() as $row) {
// does this row have an attachment?
if($row->attachment!='') {
$result[] = $row->attachment;
}
// add all children attachments
$result = array_merge($result, getChildrenAttachments($row->id));
}
// return result set
return $result
}
此实现未考虑实际拥有附件的当前menu_id
。您可以创建一个新函数,考虑检查当前ID的getAttachmentsForTree()
,然后将ID传递给getChildrenAttachments()
...
P.S。我没有运行代码,所以我很抱歉代码可能存在任何问题。这只是一个关于如何在这种情况下使用递归优势的示例。