自己前几天写的无限分类类_PHP教程

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

主要思想来自: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 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 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 $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);

}

}

?>

http://www.bkjia.com/PHPjc/317731.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/317731.htmlTechArticle前一周写的吧,使用中效果还不错。 主要思想来自:http://www.phpobject.net/b...[url=http://www.phpobject.net/blog/read.php?49][/url] 这里就不多解释原理了...

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

php 类分开写,自己前几天写的无限分类类_PHP教程相关推荐

  1. 用CIL写程序:定义一个叫“慕容小匹夫”的类

    前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...

  2. 用java写一个金字塔,一个Java写的用以构建影像金字塔的Bitmap类

    一个Java写的用来构建影像金字塔的Bitmap类 一个Java写的用来构建金字塔影像的Bitmap类 cheungmine 2012 下面每个图像都是256x256像素.目的就是把这4幅影像合成一个 ...

  3. 详解python框架django为例,还没开始写代码前的花式坑——解决办法和排错思路。pycharm解释器配置,虚拟环境venv配置,使用命令行。

    如果你现在赶项目,就直接跳到符合的标题查看解决办法.如果你对理论思考不太感冒,也可以直接跳到指定标题. 如果你是学习者,极客,时间充足,希望你能够耐心的看下去,因为你在这里,不仅仅可以找到解决办法,更 ...

  4. mave工程中的一个类调用另一个聚合工程的一个类_求求你,别再写上千行的类了好吗...

    专注于Java领域优质技术,欢迎关注 作者:橙味菌 最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了.为了防止这样的惨剧再次发生在我 ...

  5. 如何在CSDN写笔记_写笔记前的插件安装

    如果你想获得记笔勋章,或者在学习中,想记一下笔记,在不用其它工具的的情况下,还可以用本csdn的插件C笔记,本文主特给大家共享一下,写笔记前需要安装的插件以及怎么编写笔记. 一.在谷歌浏览Google ...

  6. 师范类大学计算机排名,这些师范类院校排名全国前五!有你喜欢的吗?

    原标题:这些师范类院校排名全国前五!有你喜欢的吗? 师范类大学中国的设置历史最为悠久,也是很多家长同学报考的不二之选,今天给大家梳理国内排名高的5所师范院校,供各位家长考生参考. 1.北京师范大学 中 ...

  7. 学写毛笔字前要了解的

    学写毛笔字之前,首先得准备必备工具,那就是古人称之为"文房四宝"的笔.墨.纸.砚. 第一节 毛笔 一. 毛笔的种类 在挑选毛笔之前,我们先要了解一下毛笔的种类和性能. 毛笔的种类很 ...

  8. 以前写的网页游戏辅助工具源码 传奇类的HOOK 封包 按钮

    以前写的网页游戏辅助工具源码 传奇类的HOOK 封包 按钮. 限量出源码,有需要的 116327160

  9. a类学科计算机,教育部最新一轮学科评估,A类学科数排名前5的大学,性价比最高...

    一所高校的实力如何体现呢?除了从师资力量.科研经费.毕业生就业率外,学科建设实力也直接挂钩着一所大学的综合实力,如果有一所大学的学科入选国家A类建设学科,那么则证明这一所大学有着很不错的学科发展基础, ...

最新文章

  1. 重庆python就业工资待遇-重庆Python人工智能编程
  2. BZOJ 2752: [HAOI2012]高速公路(road)
  3. 阿里云centos mysql_阿里云ECS服务器CentOS7上安装MySql服务-阿里云开发者社区
  4. 如何:将 TraceSource 和筛选器与跟踪侦听器一起使用(转载)
  5. 开放分布式追踪(OpenTracing)入门与 Jaeger 实现
  6. html语言中标记h1代表什么,HTML5中的标题标记(H1内部的P)中是否有段落元素是否有效?...
  7. 【Spring Cloud】网关 - Zuul(1.x)
  8. 删除oracle 连接进程,如何查看和清除oracle无用的连接进程
  9. Android入门笔记10
  10. OpenCV-图像处理(01、图像的加载、修改与保存)
  11. 计算机网络设备是固定资产哪类,财政六大类常用固定资产分类及代码
  12. Java连接数据库(JDBC编程六步)
  13. jq json格式化工具
  14. 服务器系统2012u盘安装教程,windows2012 u盘安装教程
  15. 【Kilav】数据库知识点速通 其二
  16. 沉默的潜意识音频Creator软件
  17. 关于 IOS 的299$ 美元企业模式(In House)及Installing Apps Wirelessly 详解
  18. 为什么可以做Shopyy独立站
  19. java 集合封装树形结构
  20. pe下bootice修复Linux引导,pe下修复引导不成功?这种方法才是最有效的解决方法...

热门文章

  1. mybatis自动生成代码只有insert()和insertSelective()
  2. Centos7 开机启动汇总
  3. 检测到目标FTP服务可匿名访问
  4. 工作流实战_11_flowable 流程实例 跟踪流程
  5. Centos出现-bash: unzip: command not found的解决办法
  6. 我好像明白了如何画序列图了
  7. 将服务器get到的响应打印,得到HttpResponse的响应主体
  8. c语言20152016真题及答案,2016年计算机二级《C语言》基础练习题及答案(15)
  9. 已知函数func的C语言代码框架,第三章习题-ddg..doc
  10. matlab 读取mov文件格式,VideoReader 支持的文件格式 - MATLAB VideoReader.getFileFormats - MathWorks 中国...