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

 更新时间:2015年07月10日 10:29:02   作者:mckee  
这篇文章主要介绍了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.phpddt.com', 12, 13, 0, 1400044901);

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设计模式 php实现抽象工厂模式

    这篇文章主要介绍了php设计模式中的抽象工厂模式,使用php实现抽象工厂模式,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • php函数之子字符串替换&#65279; str_replace

    php函数之子字符串替换&#65279; str_replace

    php函数str_replace: 返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。
    2011-03-03
  • PHP 存储文本换行实现方法

    PHP 存储文本换行实现方法

    在文本存储时使用\n如果发现没有效果, 这时可以使用\r\n就可以了,希望对有需要的朋友有所帮助。
    2010-01-01
  • 解析如何去掉CodeIgniter URL中的index.php

    解析如何去掉CodeIgniter URL中的index.php

    本篇文章是对如何去掉CodeIgniter URL中index.php的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP中md5()函数的用法讲解

    PHP中md5()函数的用法讲解

    今天小编就为大家分享一篇关于PHP中md5()函数的用法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • php 用checkbox一次性删除多条记录的方法

    php 用checkbox一次性删除多条记录的方法

    一次性删除多条记录,对于比较多的信息,如果没有批量删除功能是非常麻烦的。这样就方便多了。
    2010-02-02
  • PHP中单引号和双引号的区别详解

    PHP中单引号和双引号的区别详解

    看好多代码有时候用单引号或双引号实现包含字符串的内容,其实简单个概括下双引号中的变量可以解析,单引号就是绝对的字符串,下面这篇文章主要给大家介绍了关于PHP中单引号和双引号区别的相关资料,需要的朋友可以参考下
    2023-01-01
  • php下将XML转换为数组

    php下将XML转换为数组

    PHP XML To Array,将XML转换为数组,需要的朋友可以参考下。
    2010-01-01
  • php tpl模板引擎定义与使用示例

    php tpl模板引擎定义与使用示例

    这篇文章主要介绍了php tpl模板引擎定义与使用,结合实例形式分析了php模板引擎的定义与使用相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • php中adodbzip类实例

    php中adodbzip类实例

    这篇文章主要介绍了php中adodbzip类,以实例形式详细讲述了adodbzip类文件的实现方法与使用技巧,注释中包含详尽的功能说明,非常具有实用价值,需要的朋友可以参考下
    2014-12-12

最新评论