自己前几天写的无限分类类


Posted in PHP onFebruary 14, 2007

前一周写的吧,使用中效果还不错。

 主要思想来自:http://www.phpobject.net/b...[url=http://www.phpobject.net/blog/read.php?49][/url]

  这里就不多解释原理了,直接发代码。

  PS:这里代码是不能直接使用的,必须结合我的一些其他库类。应该说思想才是最重要的,这里主要提供一种分类的思路。

<?  
/**  
--   
-- 表的结构 `daxue8_category`  
--   CREATE TABLE `daxue8_category` (  
  `cid` smallint(6) NOT NULL auto_increment,  
  `pid` smallint(6) NOT NULL default '0',  
  `level` smallint(6) NOT NULL default '0',  
  `cname` char(64) NOT NULL default '',  
  `lft` smallint(6) NOT NULL default '0',  
  `rgt` smallint(6) NOT NULL default '0',  
  `uid` mediumint(8) NOT NULL default '0',  
  `username` char(32) NOT NULL default '',  
  `ctime` int(10) NOT NULL default '0',  
  `cstate` tinyint(1) NOT NULL default '0',  
  `gnum` mediumint(8) NOT NULL default '0',  
  `orderstyle` smallint(3) NOT NULL default '0',  
  PRIMARY KEY  (`cid`)  
) TYPE=MyISAM AUTO_INCREMENT=2 ;  
--   
-- 导出表中的数据 `daxue8_category`  
--   
INSERT INTO `daxue8_category` VALUES (1, 0, 1, 'root', 1, 2, 0, '管理员', 1163608814, 1, 0, 0);  
*/  
class category  
{  
    var $module;  
    var $tbname;  
    function category()  
    {  
        $this->tbname=TB_PREX.'_category';  
        $this->module=new module($this->tbname);  
    }  
    /**  
      * 增加子节点  
      * @param array $node 待增加子节点的属性  
      * @param int $pid 父节点的ID  
    */  
    function add($node,$pid){  
        //检查是否已经存在该节点  
        if($node_exist=$this->module->detail('where pid='.$pid.' and cname=\''.$node['cname'].'\'')){  
            //$this->error(__FUNCTION__.'():该节点'.$node['cname'].'已经存在!');  
            //print_r($node_exist);  
            return $node_exist['cid'];  
        }  
        //获取父节点信息  
        $pnode=$this->get_by_cid($pid);  
        //更新其他节点  
        $this->module->query('update `'.$this->tbname.'` set lft=lft+2 where lft>'.$pnode['rgt']);  
        $this->module->query('update `'.$this->tbname.'` set rgt=rgt+2 where rgt>='.$pnode['rgt']);  
        //插入新节点  
        $node['pid']=$pid;  
        $node['lft']=$pnode['rgt'];  
        $node['rgt']=$pnode['rgt']+1;  
        $node['level']=$pnode['level']+1;//层次加一  
        return $this->module->add($node);  
    }  
    /**  
      * 删除节点  
      * @param $cid 待删除的节点的ID  
      * @param $delete_childern 如果该节点存在子节点,是否强制删除。设置未true,则当存在子节点的时候,删除失败,返回false  
      *  
    */  
    function delete($cid,$delete_childern=false)  
    {  
        //获取节点信息  
        $node=$this->get_by_cid($cid);  
        if(($this->child_num($node)>0)&&(!$delete_childern))$this->error(__FUNCTION__.'():该节点存在子节点!');  
        //删除该节点及其所有子节点  
        $this->module->delete('where lft between '.$node['lft'].' and '.$node['rgt']);  
        //修改相应的左右键值  
        $plus=$node['rgt']-$node['lft']+1;  
        $this->module->query('update `'.$this->tbname.'` set lft=lft-'.$plus.' where lft>'.$node['rgt']);  
        $this->module->query('update `'.$this->tbname.'` set rgt=rgt-'.$plus.' where rgt>'.$node['rgt']);  
        return true;  
    }  
    /**  
      * 更新一个节点  
      * @param array $set更新集  
      * @param int $cid 更新的节点的主键ID  
    */  
    function update($set,$cid){  
        return $this->module->update($set,'where cid='.$cid);  
    }  
    /**  
      * 选取节点及其子节点  
      * @param int $cid节点的主键ID  
      * @param int $deep选取深度  
    */  
    function select($cid,$deep=0)  
    {  
        //获取节点信息  
        $node=$this->get_by_cid($cid);  
        $where='where lft between '.$node['lft'].' and '.$node['rgt'];  
        if(!empty($deep))$where.=' and level<'.$node['level']+$deep;  
        if($deep==1){  
            $where.=' order by orderstyle desc';  
        }else{  
            $where.=' order by lft asc';              
        }  
        return $this->module->select($where);  
    }  
    /**  
      * 获取父节点路径  
      * @param int $cid 节点的ID   
    */  
    function get_parent($cid)  
    {  
        $node=$this->get_by_cid($cid);  
        return $this->module->select('where lft<='.$node['lft'].' and rgt>='.$node['rgt'].' order by lft asc');  
    }  
    /**  
      * 选取子节点  
      * @param int $cid节点的主键ID  
      * @param int $deep选取深度  
    */  
    function get_children($pid,$deep=0){  
        //获取节点信息  
        $pnode=$this->get_by_cid($pid);  
        $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt'];  
        if(!empty($deep))$where.=' and level<='.($pnode['level']+$deep);  
        if($deep==1){  
            $where.=' order by orderstyle desc';  
        }else{  
            $where.=' order by lft asc';              
        }  
        return $this->module->select($where);  
    }  
    /**  
      * 获取第deep层子节点  
      * @param int $cid节点的主键ID  
      * @param int $deep选取深度  
    */  
    function get_level_children($pid,$deep){  
        //获取节点信息  
        $pnode=$this->get_by_cid($pid);  
        $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt'];  
        $where.=' and level='.($pnode['level']+$deep);  
        $where.=' order by orderstyle desc';  
        return $this->module->select($where);  
    }  
    /**  
      * 获取节点信息  
      * @param $cid 节点的主键ID  
      * @return array $node  
    */  
    function get_by_cid($cid){  
        $node=$this->module->detail('where cid='.$cid);  
        if(!$node)$this->error(__FUNCTION__.'():获取节点'.$cid.'失败!');  
        return $node;  
    }  
    /**  
      * 获取子节点的数目  
      * @param array $node 节点信息  
      * @return num  
    */  
    function child_num($node){  
        return ($node['rgt']-$node['lft']-1)/2;  
    }  
    /**  
      * 按照层次显示分类  
      * @param int $cid节点的主键ID  
      * @output  
    */  
    function display($cid)  
    {  
        $nodes=$this->select($cid);  
        foreach($nodes as $node){  
            echo str_repeat('   ',$node['level']-1).$node['cname']."\n";  
        }  
    }  
/*-------private-----------------------------------*/  
    function error($msg){  
        die('ERROR : file '.__FILE__.' function '.$msg);  
    }  
}  
?> 
PHP 相关文章推荐
又一个php 分页类实现代码
Dec 03 PHP
三个类概括PHP的五种设计模式
Sep 05 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
PHP加密解密类实例分析
Apr 20 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
Sep 11 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
Linux下 php7安装redis的方法
Nov 01 PHP
PHP+Oracle本地开发环境搭建方法详解
Apr 01 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 #PHP
php中的一个中文字符串截取函数
Feb 14 #PHP
PHP音乐采集(部分代码)
Feb 14 #PHP
一个数据采集类
Feb 14 #PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 #PHP
增加反向链接的101个方法 站长推荐
Jan 31 #PHP
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 #PHP
You might like
使用PHP批量生成随机用户名
2008/07/10 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
vue mounted组件的使用
2018/06/18 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
Python中无限元素列表的实现方法
2014/08/18 Python
Python的time模块中的常用方法整理
2015/06/18 Python
python使用turtle库绘制树
2018/06/25 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
机械专业毕业生自荐信
2013/11/02 职场文书
幼儿园招生广告
2014/03/19 职场文书
干部作风建设心得体会
2014/10/22 职场文书
服务整改报告
2014/11/06 职场文书
三好学生事迹材料
2014/12/24 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android