php通过前序遍历树实现无需递归的无限极分类
发布:smiling 来源: PHP粉丝网 添加日期:2021-06-11 09:50:11 浏览: 评论:0
这篇文章主要介绍了php通过前序遍历树实现无需递归的无限极分类,涉及基于CI框架针对数据库的查询与遍历操作,具有一定参考借鉴价值,需要的朋友可以参考下。
本文实例讲述了php通过前序遍历树实现无需递归的无限极分类,分享给大家供大家参考,具体如下:
大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限极分类,在大数据量实现树状层级结构的时候效率更高。
sql代码如下:
- CREATE TABLE IF NOT EXISTS `category` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `title` varchar(50) NOT NULL,
- `lft` int(11) NOT NULL,
- `rgt` int(11) NOT NULL,
- `order` int(11) NOT NULL COMMENT '排序',
- `create_time` int(11) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
- --
- -- 转存表中的数据 `category`
- --
- INSERT INTO `category` (`id`, `title`, `lft`, `rgt`, `order`, `create_time`) VALUES
- (1, '顶级栏目', 1, 20, 1, 1261964806),
- (2, '编辑后的分类', 16, 19, 50, 1264586212),
- (4, '公司产品', 10, 15, 50, 1264586249),
- (5, '荣誉资质', 8, 9, 50, 1264586270),
- (6, '资料下载', 6, 7, 50, 1264586295),
- (7, '人才招聘', 4, 5, 50, 1264586314),
- (8, '留言板', 2, 3, 50, 1264586884),
- (9, '总裁', 17, 18, 50, 1267771951),
- (10, '新的分类的子分类', 11, 14, 0, 1400044841),
- (11, 'PHP粉丝网-http://www.phpfensi.com', 12, 13, 0, 1400044901);
php代码如下:
- <?php
- /**
- * 纯属测试
- *
- * @author Mckee
- * @link http://www.phpfensi.com
- */
- class Category extends CI_Controller {
- public function __construct()
- {
- parent::__construct();
- $this->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'] . '<br />';
- }
- }
- /**
- *
- * 插入操作很简单找到其父节点,之后把左值和右值大于父节点左值的节点的左右值加上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';
- }
- }
Tags: php遍历树 php无限极分类
- 上一篇:php基于Snoopy解析网页html的方法
- 下一篇:PHP实现事件机制的方法
相关文章
- ·php遍历树的常用方法汇总(2021-05-28)
- ·php无限极分类递归排序(2014-10-22)
- ·php无限极分类递归排序实现方法(2021-04-25)
- ·PHP超牛逼无限极分类生成树方法(2021-05-26)
- ·PHP实现无限极分类的两种方式示例【递归和引用方式】(2021-11-14)
- ·php无限极分类实现方法分析(2021-12-02)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)