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


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 18 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
PHP 八种基本的数据类型小结
Jun 01 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
PHP实现事件机制实例分析
Jun 26 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
PHP实现的装箱算法示例
Jun 23 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 PHP
PHP7 其他语言层面的修改
Mar 09 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制作静态网站的模板框架
2006/10/09 PHP
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
php生成gif动画的方法
2015/11/05 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
jquery选择器简述
2015/08/31 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Python程序暂停的正常处理方法
2019/11/07 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
毕业生在校学习的自我评价分享
2013/10/08 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
聚美优品励志广告词
2014/03/14 职场文书
cf战队收人广告词
2014/03/14 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android