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

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

发布时间:2020-12-13 02:45:02 所属栏目:PHP教程 来源:网络整理
导读:《php通过前序遍历树实现无需递归的无限极分类》要点: 本文介绍了php通过前序遍历树实现无需递归的无限极分类,希望对您有用。如果有疑问,可以联系我们。 PHP实例 本篇章节讲解php通过前序遍历树实现无需递归的无限极分类.供大家参考研究.具体如下

《php通过前序遍历树实现无需递归的无限极分类》要点:
本文介绍了php通过前序遍历树实现无需递归的无限极分类,希望对您有用。如果有疑问,可以联系我们。

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

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

PHP实例sql代码如下:

PHP实例
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,1261964806),(2,'编辑后的分类',16,19,50,1264586212),(4,'公司产品',10,15,1264586249),(5,'荣誉资质',8,9,1264586270),(6,'资料下载',6,7,1264586295),(7,'人才招聘',4,5,1264586314),(8,'留言板',2,3,1264586884),(9,'总裁',17,18,1267771951),(10,'新的分类的子分类',11,14,1400044841),(11,'PHP点点通-http://www.phpddt.com',12,13,1400044901);

PHP实例php代码如下:

PHP实例
<?php
/**
 * 纯属测试
 * 
 * @author Mckee
 * @link http://www.phpddt.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';
  }
}

PHP实例希望本文所述对大家的php程序设计有所帮助.

《php通过前序遍历树实现无需递归的无限极分类》是否对您有启发,欢迎查看更多与《php通过前序遍历树实现无需递归的无限极分类》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

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

    推荐文章
      热点阅读