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中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php创建表设置编码,教您在Zend Framework里如何设置数据库编码以及怎样给数据表设定前缀!...

当我们在开发项目时..大家都会遇到一个问题就是:数据库的编码问题.当然我们不用Zend Framework做为项目开发的框架时..我们可以很快,很容易搞定这个小问题..但是当我们要使用Zend Framewok开发项目时..我们可能一时会不知道如何解决这个小问题..比如我就是这样的人..在开发这个…

python 怎么将数组转为列表_怎么将视频转为GIF动态图 表情包怎么制作

说到GIF&#xff0c;大家应该都不陌生了吧&#xff01;尤其是在聊天中使用较多&#xff0c;似乎一言不合就开启了斗图模式&#xff0c;但是我们平时使用的GIF一般都是软件中自带的&#xff0c;其实自己制作也是很方便的&#xff0c;而且会发现很有趣&#xff0c;不但可以直接录…

curl php 百度,php curl 模拟登录百度主页

php curl 模拟登录百度首页本帖最后由 STONEWP 于 2012-03-29 13:43:04 编辑代码如下&#xff1a;$url "https://passport.baidu.com/?login&tplmn";//$url "http://www.baidu.com/";$cookdir "d:/www/html/mndl/cookie.txt";$ch curl_…

proteus里面没有stm32怎么办_嵌入式单片机之stm32串口你懂了多少!!

stm32作为现在嵌入式物联网单片机行业中经常要用多的技术&#xff0c;相信大家都有所接触&#xff0c;今天这篇就给大家详细的分析下有关于stm32的出口&#xff0c;还不是很清楚的朋友要注意看看了哦&#xff0c;在最后还会为大家分享有些关于stm32的视频资料便于学习参考。点击…

tomcat不能解析php,tomcat不支持php怎么办

tomcat不支持php的解决办法&#xff1a;首先将“PHP/Java Bridge”下的相关文件复制到tomcat的lib目录下&#xff1b;然后修改tomcat安装目录下conf文件夹里的“web.xml”文件&#xff1b;最后重启tomcat即可。java开发者都知道&#xff0c;tomcat是用来部署java web项目的。这…

c++ dicom图像切割_【高训智造】原创专业课堂第225期--定位滑座的线切割加工

原标题&#xff1a;【高训智造】原创专业课堂第225期--定位滑座的线切割加工欢迎来到【高训智造】原创专业课堂第225期&#xff0c;本期由郭沃沛老师给大家带来线切割小课堂。定位滑座的线切割加工郭沃沛1零件图如图1所示为定位滑座零件图&#xff0c;其材料为45钢&#xff0c;…

php.ini配置详解 号,php INI配置文件的解析实现分析

我不知道怎么说才好&#xff0c;因为我在读INI文件的时候&#xff0c;往往都是用现成的函数&#xff1a;parse_ini_file或者是parse_ini_string&#xff0c;但怎么写入&#xff0c;就是另外的方法了(自己实现。。。。)所以看到这篇文章的时候&#xff0c;我也才刚刚知道&#x…

c iostream.源码_通达信指标公式源码精准买卖主图指标公式免费分享

V0:EMA(C,5),COLOR00FF66;V1:EMA(C,10),COLOR00FF66;V2:EMA(C,15),LINETHICK2,COLORFFFFFF;V3:EMA(C,30);V4:EMA(C,60),COLOR3366FF;年线:EMA(C,90),COLORBLUE;M1:1000*V1/V4<1015 AND 1000*V1/V4>975;M2:1000*V2/V4<1020 AND 1000*V2/V4>980;M3:1000*V3/V4<101…

4am永远 鼠标按键设置_4AM称霸PCL和PEL 绝地求生与和平精英的双端冠军 | 电玩巴士...

在《绝地求生》PCL秋季赛&#xff0c;4AM高分碾压全场斩获冠军&#xff1b;在手游和平精英PEL联赛上4AM战队再度重拳出击荣获S3总冠军。在同一时间&#xff0c;4AM战队实现了端游与手游双冠王的神迹&#xff01;要说国内第一大逃杀电竞俱乐部&#xff0c;4am自认第二&#xff0…

checkA.php,php window平台模拟checkdnsrr函数检测_php

在php的系统函数中有一个checkdnsrr函数&#xff0c;该函数的作用是根据一个给定的host name(域名)或者IP地址检查它是否有DNS记录&#xff0c;目的就是检验它是否真实存在。但是该函数仅可以在linux系统下使用&#xff0c;并不支持windows平台。下面是网上搜集到的一个hack的方…

oracle临时表经常被锁_【赵强老师】Oracle数据库的存储结构

Oracle的存储结构分为&#xff1a;物理存储结构和逻辑存储结构。一、物理存储结构&#xff1a;指硬盘上存在的文件数据文件(data file)一个数据库可以由多个数据文件组成的&#xff0c;数据文件是真正存放数据库数据的。一个数据文件就是一个操作系统文件。数据库的对象(表和索…

php页面的循环输出数组,PHP抓取页面上的数组 并循环输出 急

PHP抓取页面上的数组 并循环输出 急 在线等我用file_get_contents()抓取了 这个网址上的内容http://simonfenci.sinaapp.com/index.php?keysimon&wd1314abc看似好像反回的是数组。。但是我不管怎么用foreach循环都报错。。我只想把数组中的word里面的值 取出来。。谁帮帮我…

h5 nan_手把手教你将H5游戏打包成快游戏

H5游戏可以通过快应用的web组件快速打包成快游戏&#xff0c;打包上架后的快游戏&#xff0c;只要原H5游戏的url不发生变动&#xff0c;快游戏就不需要做更新&#xff0c;维护工作量小。使用快应用IDE&#xff0c;打包快游戏的操作很简单。访问官网安装开发工具&#xff0c;在P…

php 构造函数 返回值,php构造函数与析构函数实例分析

本节内容&#xff1a;php构造函数与析构函数例子&#xff1a;复制代码 代码示例:class Person{public $name;public $age;public function __construct($name,$age){$this->name $name;$this->age $age;}function __destruct(){echo $this->name."销毁资源&…

平板电脑有什么用_除了盖泡面,平板电脑没什么用了

平板电脑似乎变成一个鸡肋&#xff0c;逐渐没有多少人买了。就算拥有&#xff0c;抱在怀里把玩的机会少了&#xff0c;躺在角落吃灰的时候多了。曾经&#xff0c;没有人能拒绝平板电脑的诱惑。有了平板&#xff0c;你仿佛跻身上流社会。不经意间拿出时的从容&#xff0c;打开皮…

java程序面向对象show,20165309 实验二 Java面向对象程序设计

2017-2018-2 20165309实验二《Java面向对象程序设计》实验报告一、实验内容1. 初步掌握单元测试和TDD2. 理解并掌握面向对象三要素&#xff1a;封装、继承、多态3. 初步掌握UML建模4. 熟悉S.O.L.I.D原则5. 了解设计模式二、实验步骤(一)单元测试1.三种代码&#xff1a;伪代码、…

php dom 丢失内容,PHP DOMDocument缺失

我在运行$dom new DOMDocument(“1.0”,“utf-8”)时遇到一个奇怪的错误&#xff1a;警告&#xff1a;require_once(classes / DOMDocument.class.php)[function.require-once]&#xff1a;无法打开流&#xff1a;第5行的/var/www/html/cms/bootstrap.php中没有这样的文件或目…

jade软件_TEM衍射斑点标定之DM软件

虽然透射电子显微镜(TEM) 能在纳米尺度上实现对待测样品形貌、 尺寸的分析&#xff1b; 结合选区电子衍射(SAED)&#xff0c;可以更进一步实现对待测样品的晶体结构、 晶相组成的鉴定&#xff0c;从而提高样品分析的准确度和可靠性。可是&#xff0c;每个刚接触TEM的小白&#…

dorado 7 怎么样_一点点奶茶怎么样?消费者眼中的网红奶茶

最近在朋友圈, -款奶茶火速蹿红,不错,那正是近期疯传的网红奶茶一点点奶茶。一点点奶茶是-款主打台湾正宗波霸奶茶的茶饮品牌,而这样的奶茶在现在的市场中就表现的十分有潜力, 尤其受年轻群体的喜欢!一点点奶茶怎么样?它的崛起是无可厚非的,它那美丽的外形,别具-格的属性&…

Mysql 启动失败没日志,MySQL Server 5.7将无法启动,并且未填充错误日志

我最近在Ubuntu 14.04上安装了MySQL Server 5.7(通过ansible使用this role是具体的).首次安装时启动很好,但是当我尝试重新启动它时,它会永远挂起&#xff1a;sudo service mysql restart* Stopping MySQL Community Server 5.7.13* MySQL Community Server 5.7.13 is already …