加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php通过前序遍历树实现无需递归的无限极分类

发布时间:2020-12-12 21:00:01 所属栏目:PHP教程 来源:网络整理
导读:本篇章节讲解php通过前序遍历树实现无需递归的无限极分类。供大家参考研究。具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限极分类,在大数据量实现树状层级结构的时候效

本篇章节讲解php通过前序遍历树实现无需递归的无限极分类。分享给大家供大家参考。具体如下:

大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限极分类,在大数据量实现树状层级结构的时候效率更高。

sql代码如下:

php代码如下:

load->database(); } public function view() { $lists = $this->db->order_by('lft','asc')->get('category')->result_array(); //相邻的两条记录的右值第一条的右值比第二条的大那么就是他的父类 //我们用一个数组来存储上一条记录的右值,再把它和本条记录的右值比较,如果前者比后者小,说明不是父子关系,就用array_pop弹出数组,否则就保留 //两个循环而已,没有递归 $parent = array(); $arr_list = array(); foreach($lists as $item){ if(count($parent)){ while (count($parent) -1 > 0 && $parent[count($parent) -1]['rgt'] < $item['rgt']){ array_pop($parent); } } $item['depath'] = count($parent); $parent[] = $item; $arr_list[]= $item; } //显示树状结构 foreach($arr_list as $a) { echo str_repeat('--',$a['depath']) . $a['title'] . '
'; } } /** * * 插入操作很简单找到其父节点,之后把左值和右值大于父节点左值的节点的左右值加上2,之后再插入本节点,左右值分别为父节点左值加一和加二 */ public function add() { //获取到父级分类的id $parent_id = 10; $parent_category = $this->db->where('id',$parent_id)->get('category')->row_array(); //1.左值和右值大于父节点左值的节点的左右值加上2 $this->db->set('lft','lft + 2',FALSE)->where(array('lft >' => $parent_category['lft']))->update('category'); $this->db->set('rgt','rgt + 2',FALSE)->where(array('rgt >' => $parent_category['lft']))->update('category'); //2.插入新的节点 $this->db->insert('category',array( 'title' => '新的分类的子分类','lft' => $parent_category['lft'] + 1,'rgt' => $parent_category['lft'] + 2,'order' => 0,'create_time' => time() )); echo 'add success'; } /** * 删除 * * //1.得到删除的节点,将右值减去左值然后加1,得到值$width = $rgt - $lft + 1; * //2.删除左右值之间的所有节点 * //3.修改条件为大于本节点右值的所有节点,操作为把他们的左右值都减去$width */ public function delete() { //通过分类id获取分类 $id = 3; $category = $this->db->where('id',$id)->get('category')->row_array(); //计算$width $width = $category['rgt'] - $category['lft'] + 1; //1.删除该条分类 $this->db->delete('category',array('id' => $id)); //2.删除左右值之间的所有分类 $this->db->delete('category',array('lft >' => $category['lft'],'lft <' => $category['rgt'])); //3.修改其它节点的值 $this->db->set('lft',"lft - {$width}",FALSE)->where(array('lft >' => $category['rgt']))->update('category'); $this->db->set('rgt',"rgt - {$width}",FALSE)->where(array('rgt >' => $category['rgt']))->update('category'); echo 'delete success'; } //编辑, public function edit() { //不用说了, 直接通过id编辑 $id = 2; $this->db->update('category',array( 'title' => '编辑后的分类' ),array( 'id' => $id )); echo 'edit success'; } }

希望本文所述对大家的php程序设计有所帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读