php 类分开写,自己前几天写的无限分类类_PHP教程
自己前几天写的无限分类类_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教程相关推荐
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- 用java写一个金字塔,一个Java写的用以构建影像金字塔的Bitmap类
一个Java写的用来构建影像金字塔的Bitmap类 一个Java写的用来构建金字塔影像的Bitmap类 cheungmine 2012 下面每个图像都是256x256像素.目的就是把这4幅影像合成一个 ...
- 详解python框架django为例,还没开始写代码前的花式坑——解决办法和排错思路。pycharm解释器配置,虚拟环境venv配置,使用命令行。
如果你现在赶项目,就直接跳到符合的标题查看解决办法.如果你对理论思考不太感冒,也可以直接跳到指定标题. 如果你是学习者,极客,时间充足,希望你能够耐心的看下去,因为你在这里,不仅仅可以找到解决办法,更 ...
- mave工程中的一个类调用另一个聚合工程的一个类_求求你,别再写上千行的类了好吗...
专注于Java领域优质技术,欢迎关注 作者:橙味菌 最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了.为了防止这样的惨剧再次发生在我 ...
- 如何在CSDN写笔记_写笔记前的插件安装
如果你想获得记笔勋章,或者在学习中,想记一下笔记,在不用其它工具的的情况下,还可以用本csdn的插件C笔记,本文主特给大家共享一下,写笔记前需要安装的插件以及怎么编写笔记. 一.在谷歌浏览Google ...
- 师范类大学计算机排名,这些师范类院校排名全国前五!有你喜欢的吗?
原标题:这些师范类院校排名全国前五!有你喜欢的吗? 师范类大学中国的设置历史最为悠久,也是很多家长同学报考的不二之选,今天给大家梳理国内排名高的5所师范院校,供各位家长考生参考. 1.北京师范大学 中 ...
- 学写毛笔字前要了解的
学写毛笔字之前,首先得准备必备工具,那就是古人称之为"文房四宝"的笔.墨.纸.砚. 第一节 毛笔 一. 毛笔的种类 在挑选毛笔之前,我们先要了解一下毛笔的种类和性能. 毛笔的种类很 ...
- 以前写的网页游戏辅助工具源码 传奇类的HOOK 封包 按钮
以前写的网页游戏辅助工具源码 传奇类的HOOK 封包 按钮. 限量出源码,有需要的 116327160
- a类学科计算机,教育部最新一轮学科评估,A类学科数排名前5的大学,性价比最高...
一所高校的实力如何体现呢?除了从师资力量.科研经费.毕业生就业率外,学科建设实力也直接挂钩着一所大学的综合实力,如果有一所大学的学科入选国家A类建设学科,那么则证明这一所大学有着很不错的学科发展基础, ...
最新文章
- 重庆python就业工资待遇-重庆Python人工智能编程
- BZOJ 2752: [HAOI2012]高速公路(road)
- 阿里云centos mysql_阿里云ECS服务器CentOS7上安装MySql服务-阿里云开发者社区
- 如何:将 TraceSource 和筛选器与跟踪侦听器一起使用(转载)
- 开放分布式追踪(OpenTracing)入门与 Jaeger 实现
- html语言中标记h1代表什么,HTML5中的标题标记(H1内部的P)中是否有段落元素是否有效?...
- 【Spring Cloud】网关 - Zuul(1.x)
- 删除oracle 连接进程,如何查看和清除oracle无用的连接进程
- Android入门笔记10
- OpenCV-图像处理(01、图像的加载、修改与保存)
- 计算机网络设备是固定资产哪类,财政六大类常用固定资产分类及代码
- Java连接数据库(JDBC编程六步)
- jq json格式化工具
- 服务器系统2012u盘安装教程,windows2012 u盘安装教程
- 【Kilav】数据库知识点速通 其二
- 沉默的潜意识音频Creator软件
- 关于 IOS 的299$ 美元企业模式(In House)及Installing Apps Wirelessly 详解
- 为什么可以做Shopyy独立站
- java 集合封装树形结构
- pe下bootice修复Linux引导,pe下修复引导不成功?这种方法才是最有效的解决方法...
热门文章
- mybatis自动生成代码只有insert()和insertSelective()
- Centos7 开机启动汇总
- 检测到目标FTP服务可匿名访问
- 工作流实战_11_flowable 流程实例 跟踪流程
- Centos出现-bash: unzip: command not found的解决办法
- 我好像明白了如何画序列图了
- 将服务器get到的响应打印,得到HttpResponse的响应主体
- c语言20152016真题及答案,2016年计算机二级《C语言》基础练习题及答案(15)
- 已知函数func的C语言代码框架,第三章习题-ddg..doc
- matlab 读取mov文件格式,VideoReader 支持的文件格式 - MATLAB VideoReader.getFileFormats
- MathWorks 中国...