手机版

php实现无限分类(递归方法)

时间:2021-09-08 来源:互联网 编辑:宝哥软件园 浏览:

我相信许多学习php的小伙伴会尝试成为一个在线商城,以此来提高他们的技能。商品分类、商品名等各种操作都要得心应手,可以尝试做一个无限分类列表。

网上搜到的php中有很多无限极点分类,但很多都是一个。而且书写凌乱,代码很多。让我们学习如何做它。那些都不靠谱,还是自己做吧。

什么是无限分类?

无限分类是一种分类技术,如部门组织、文章分类、主题分类等。这往往是用来无限分类的,所以简单地把它理解为分类。其实仔细想想,生活中的分类太多了。衣服可以分为男装和女装,夹克和裤子,也可以根据年龄组进行分类。分类无处不在,似乎“无限”。这里就不谈无限分类的必要性了。

无限分类原理简介

无限分类看似‘越来越高’,但其实原理很简单。无限分类不仅需要代码的独创性,还需要数据库设计的合理性。为了满足无限分类,数据库需要两个必需的字段,ID和PID。Id用于标识自身,而pid用于指示父id。也就是说,每个分类记录不仅描述自己,还描述与它最密切相关的另一个id。看似复杂的事情,却被这么一个小技巧解决了。

闲话不多,是时候展示这篇文章的例子了。

作为一个狂热的海盗迷,我将以《海贼王》人物组织为例。

数据库准备:

打造一体式腕表:

创建表单件(id int auto_increment,pid int不为null,name varchar(225)不为null,主键(id));插入测试数据:

插入onepiece值(1,0,‘海军’)、(2,0,‘海盗’)、(3,0,‘革命军’)、(4,1,‘野鸡’)、(5,1,‘红狗’)、(6,1以下是《one piece》科普下的设定:世界分为三大阵营:海军、One Piece、革命军。海军里有将军:蓝雉、红狗和黄猿。海盗有:四皇、七武海、草帽海盗。四皇有詹克斯,七乌海有佛朗哥,鳄鱼,草帽海盗有索隆。广告:一片真好。

最终目标:

今天我们做两种形式的无限分类,一种是下拉列表,一种是导航链接。直接在效果图上:

下拉列表

导航链接类型

示例代码:

我封装了一个Unlimited类,用来调用diaplayList()来显示下拉列表的形式,用diaplayLink来显示导航链接分类。您还可以添加(添加节点())和删除(删除节点)类别。

?phpclass Unlimited { protected $ MySQL;public function _ _ construct($ config){ $ this-MySQL=new MySQL($ config[' host '],$config['user'],$ config[' pwd ']);$ this-MySQL-select _ db($ config[' db ']);$ this-MySQL-set _ charset(' utf8 ');if($ this-MySQL-connect _ errno){ echo $ this-MySQL-connect _ error;} }私有函数getList($pid=0,$result=array(),$ spac=0){ $ spac=$ spac 2;$sql='从单件中选择*,其中PID={ $ PID } ';$ RS=$ this-MySQL-query($ SQL);while($ row=$ RS-fetch _ assoc()){ $ row[' name ']=str _ repeat(' nbsp ',$spac).$ row[' name '];$ result[]=$ row;$this-getList($row['id'],$result,$ spac);}返回$ result} /** *展现下拉列表式分类* @ return[type]*/public function display list(){ $ RS=$ this-getList();$ str=' select name=' cateforeach($ RS as $ key=$ val){ $ str .=' option { $ val[' name ']}/option ';} $str .='/select ';返回$ str}私有函数getLink($cid,$ result=array()){ $ SQL='从一个片段中选择*,其中id={ $ cid } ';$ RS=$ this-MySQL-query($ SQL);if($ row=$ RS-fetch _ assoc()){ $ result[]=$ row;$this-getLink($row['pid'],$ result);}返回array _ reverse($ result);} /** * 展现导航link * @ param[type]$ cid[description]* @ return[type][description]*/public function display link($ cid){ $ RS=$ this-getLink($ cid);$ str=foreach ($rs为$val) { $str .=' a href=' ' { $ val[' name ']}/a ';}返回$ str} /** *增加分类* @param [type] $pid父类id * @param [type] $name本类名*/public函数addNodes($pid,$name){ $sql='插入单件值(',{$pid},' ' .$name .')';if($ this-MySQL-query($ SQL)){返回true} } /** * 删除分类* @param [type] $id本类id * @ return[type]*/public function delete nodes($ id){ $ SQL=' select * from one piece,其中PID={ $ id } ';$ RS=$ this-MySQL-query($ SQL);if($ row=$ RS-fetch _ assoc()){ $ mes='还有子元素,请勿删除;}else{ $sql='从单件中删除,其中id={ $ id } ';if($ this-MySQL-query($ SQL)){ $ mes='删除成功;} }返回$ mes}}类中函数主要采取了递归函数的方法,如果理解深刻理解递归函数,其余的部分也就水到渠成了。我会在后面的部分详细介绍实现递归函数的三种方法。

我们再来看一个实例:

首先建立分类信息表:

如果"类别"不存在,则创建表('类别名称小整数(5)无符号不为空AUTO_INCREMENT,“parentid”小整数(5)无符号不为空DEFAULT“0”,类别名称varchar(50)不为空,主键('类别名称'));插入若干数据:

在“category”(“categoryid”、“parentId”、“categoryName ”)中插入VALUES (1,0,' php ')、(2,0,' java ')、(3,0,' c/c ')、(4,1,' php基础),(5,1,' php开源资料),(6,1,' php框架),(7,2,' java Se '),(8,2,' java EE '),(9,2,' java Me '),(10,3,' c/c基础编程),(11,3 ',c/c系统开发),(12,3,' c嵌入式编程),(13,3,' c应用开发),(14,13,' c桌面应用开发),(15,13,' c游戏开发');下面是服务器端编程语言(专业超文本预处理器的缩写)代码:

?php /* php无限极分类*///获取某分类的直接子分类函数getSons($ category ys,$ CatID=0){ $ sons=array();foreach($归类为$ item){ if($ item[' parent id ']==$ CaTid)$ sons[]=$ item;}返回$ sons} //获取某个分类的所有子分类函数getSubs($ category ys,$catId=0,$ level=1){ $ subs=array();foreach($归类为$ item){ if($ item[' parent id ']==$ CaTid){ $ item[' level ']=$ level;$ subs[]=$ item;$subs=array_merge($subs,getSubs($categorys,$item['categoryId'],$ level 1));} }返回$ subs} //获取某个分类的所有父分类//方法一,递归函数getParents($ category ys,$ CatID){ $ tree=array();foreach($ categorys as $ item){ if($ item[' categoryId ']=$ catId){ if($ item[' parentId ']0)$ tree=array _ merge($ tree,getParents($categorys,$ item[' parentId ']));$ tree[]=$ item;打破;} }返回$ tree} //方法二,迭代函数getparents 2($ category ys,$ CatID){ $ tree=array();while($catId!=0){ foreach($ categorys as $ item){ if($ item[' categoryId ']==$ CatID){ $ tree[]=$ item;$ CatID=$ item[' ParentId '];打破;} } }返回$ tree} //测试部分$ pdo=新PDO(' MySQL :主机=localhostdbname=test ',' root ',' 8888 ');$stmt=$pdo-query('通过类别标识从类别顺序中选择* ');$ category ys=$ stmt-fetchAll(PDO : fetch _ ASSOC);$ result=GetSons($类别ys,1);foreach($结果为$item)回显$item['categoryName'].br ';echo ' HR $ result=getSubs($ category ys,0);foreach($结果为$item) echo str_repeat(',$item['level']).$item['categoryName'].br ';echo ' HR $ result=getParents($ category ys,7);foreach($结果为$item)回显$item['categoryName'].echo ' HR $ result=get parents 2($ category ys,15);foreach($结果为$item)回显$item['categoryName'].' ';看下最终结果吧

虽然本文介绍的是使用递归来实现的无限级分类,但实际上,并不推荐大家这么做,大家知道分类多了,递归效率也就低了,本文这里仅仅是为了让大家更好的理解递归才这么做的。

版权声明:php实现无限分类(递归方法)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。