在多级菜单中删除子项

时间:2018-05-04 20:01:53

标签: php mysql

我的表格菜单包含以下列:idvalueid_parent。 并有多级菜单:

Item0
    Item1
        Item2
            Item3

我想删除Item1,我有id。 删除Item2时如何删除Item3Item1? 我从表中选择:

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

如何使用循环或递归找到其余的孩子?

3 个答案:

答案 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。

我真的希望这会对你有所帮助。

  
      
  1. 调用递归函数,该函数将返回自身和所有子项的字符串。
  2.   
  3. 转换为数组。
  4.   
  5. 遍历数组以删除您想要的内容。
  6.   
$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