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


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 相关文章推荐
支持数组的ADDSLASHES的php函数
Feb 16 PHP
通俗易懂的php防注入代码
Apr 07 PHP
php中http_build_query 的一个问题
Mar 25 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
Yii数据库缓存实例分析
Mar 29 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
PHP中“=&gt;
Mar 01 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
PHP反射基础知识回顾
Sep 10 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封装分页函数实现文本分页和数字分页
2014/10/23 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
js实现延迟加载的几种方法详解
2019/01/19 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python程序设计入门(2)变量类型简介
2014/06/16 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python简单基础小程序的实例代码
2019/04/28 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Pandas的数据过滤实现
2021/01/15 Python
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
实习教师自我鉴定
2013/09/27 职场文书
工作散漫检讨书
2014/09/16 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
预备党员半年考察意见
2015/06/01 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
Python进程池与进程锁之语法学习
2022/04/11 Python