php 怎么进行无限级查询,php如何实现无限级分类?

在php中,可以利用递归算法并结合mysql数据表来实现无限级分类。下面本篇文章给大家介绍一下实现方法,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

f78487aa01c37f756e5b14202bd3890b.png

什么是无限级分类?

无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类。分类无处不在,分类显得“无限”。我这里就不说无限分类的必要性了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

闲话不多说,该展现本文的实例了。

作为一个狂热海贼迷,这篇的实例我就以《海贼王》人物组织做案例。

数据库准备:

建表onepiece:create table onepiece(

id int auto_increment,

pid int not null,

name varchar(225) not null,

primary key(id)

);

插入测试数据:insert onepiece values

(1,0,'海军'),

(2,0,'海贼'),

(3,0,'革命军'),

(4,1,'青雉'),

(5,1,'赤犬'),

(6,1,'黄猿'),

(7,2,'四皇'),

(8,2,'七武海'),

(9,2,'草帽海贼团'),

(10,9,'索隆'),

(11,7,'香克斯'),

(12,8,'多弗朗明哥'),

(13,8,'克洛克达尔');

这里还是科普下海贼王里面的设定:世界分为三大阵营:海军,海贼,革命军。海军有大将:青雉,赤犬,黄猿。海贼有:四皇,七武海,草帽海贼团。四皇有香克斯,七武海有多弗朗明哥,克洛克达尔,草帽海贼团有索隆。(打个广告:海贼王真的很好看)。

最终目的:

我们今天制作的是两种形式的无限级分类形式,一种是下拉列表式,一种则是导航Link式的。直接上效果图了:

下拉列表式

f7cfab6f4e35c04090c87b3788a24238.png

导航Link式

ed0eee3e4f81e89379c63871c82b84e6.png

实例代码:

我封装了一个Unlimited类,用来调用diaplayList()展现下拉列表形式,调用diaplayLink展现导航Link分类。也可以增加(addNodes())和删除(deleteNodes)分类。<?php

class Unlimited{

protected $mysqli;

public function __construct($config){

$this->mysqli=new mysqli($config['host'],$config['user'],$config['pwd']);

$this->mysqli->select_db($config['db']);

$this->mysqli->set_charset('utf8');

if ($this->mysqli->connect_errno) {

echo $this->mysqli->connect_error;

}

}

private function getList($pid=0,&$result=array(),$spac=0){

$spac=$spac+2;

$sql="select * from onepiece where pid={$pid}";

$rs=$this->mysqli->query($sql);

while($row=$rs->fetch_assoc()) {

$row['name']=str_repeat(' &nbsp',$spac).$row['name'];

$result[]=$row;

$this->getList($row['id'],$result,$spac);

}

return $result;

}

/**

* 展现下拉列表式分类

* @return [type]

*/

public function displayList(){

$rs=$this->getList();

$str="";

foreach ($rs as $key => $val) {

$str.="{$val['name']}";

}

$str.="";

return $str;

}

private function getLink($cid,&$result=array()){

$sql="select * from onepiece where id={$cid}";

$rs=$this->mysqli->query($sql);

if($row=$rs->fetch_assoc()){

$result[]=$row;

$this->getLink($row['pid'],$result);

}

return array_reverse($result);

}

/**

* 展现导航Link

* @param [type] $cid [description]

* @return [type] [description]

*/

public function displayLink($cid){

$rs=$this->getLink($cid);

$str='';

foreach ($rs as $val) {

$str.="{$val['name']}>";

}

return $str;

}

/**

* 增加分类

* @param [type] $pid 父类id

* @param [type] $name 本类名

*/

public function addNodes($pid,$name){

$sql="insert into onepiece values('',{$pid},'".$name."')";

if($this->mysqli->query($sql)){

return true;

}

}

/**

* 删除分类

* @param [type] $id 本类id

* @return [type]

*/

public function deleteNodes($id){

$sql="select * from onepiece where pid ={$id}";

$rs=$this->mysqli->query($sql);

if($row=$rs->fetch_assoc()){

$mes="还有子元素,请勿删除";

}else{

$sql="delete from onepiece where id={$id}";

if($this->mysqli->query($sql)){

$mes="删除成功";

}

}

return $mes;

}

}

类中函数主要采取了递归函数的方法,如果理解深刻理解递归函数,其余的部分也就水到渠成了。后面的php递归函数的三种方法详细介绍了php递归函数的原理。

更多相关知识,请访问 PHP中文网!!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值