我的表格菜单包含以下列:id
,value
,id_parent
。
并有多级菜单:
Item0
Item1
Item2
Item3
我想删除Item1
,我有id
。
删除Item2
时如何删除Item3
和Item1
?
我从表中选择:
public function searchChildren($id)
{
$sql = "SELECT id FROM menu WHERE id_parent = '{$id}'";
return $this->db->query($sql);
}
我可以找到id
第一个孩子:
$idChild = $this->model->search_children_id($id);
如何使用循环或递归找到其余的孩子?
答案 0 :(得分:1)
我会创建一个变量函数,我通过引用传递给它自己,可能是更好的方法来做到这一点,但我使用这个方法创建了一个树导航器,它完美地工作
我只是检查该id下是否有子节点,如果有循环,直到没有更多的子节点,一旦有,然后删除id
这是未经过测试的代码和一些伪代码,但你会得到这个想法
$DeleteIdAndChilds= function($Id) use( &$DeleteIdAndChilds){
while($ChildId = $this->model->search_children_id($Id) != null){
$DeleteIdAndChilds($ChildId);
}
//once we are here there is no more child lets delete the $Id
}
答案 1 :(得分:0)
因为你有一个id
,只需要删除功能。 examp:
function delete_menu($id){
$this->db->where('id_parent', $id);
$this->db->delete('menu');
}
答案 2 :(得分:-1)
我建议使用递归函数来查找他的所有孩子。如果同一级别有多个孩子,您希望发生什么?
更新:我的不好,我不是故意让你挂...这里有一些递归功能的代码。它基本上与我用来显示我的菜单相同,除了为了你的目的而被剥离和重构。
我对数据列使用pk_ID,Menu_Item和Menu_Parent。
我真的希望这会对你有所帮助。
- 调用递归函数,该函数将返回自身和所有子项的字符串。
- 转换为数组。
- 遍历数组以删除您想要的内容。
醇>
$menu = rtrim(($this->getMenu(0)), ",");
$menu = explode(",", $menu);
public function getMenu($p_parentID=0) {
$output = "";
$data = $this->db->order_by("Menu_Parent, Menu_Item", "ASC")->get_where("my_menu", array(
"Menu_Parent" => $p_parentID,
));
foreach ($data->result() as $row) {
$output .= "{$row->Menu_Item}<br>";
if ($this->hasChildren($row->pk_ID)) {
$output .= $this->getMenu($row->pk_ID);
}
}
return $output;
} # END FUNCTION getMenu
public function hasChildren($p_value=0) {
$data = $this->db->get_where("my_menu", array(
"Menu_Parent" => $p_value
));
$result = $data->num_rows();
return $result;
} # END FUNCTION hasChildren