php利用递归函数实现无限级分类
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
php利⽤递归函数实现⽆限级分类
相信很多学php的很多⼩伙伴都会尝试做⼀个⽹上商城作为提升⾃⼰技术的⼀种途径。
各种对商品分类,商品名之类的操作应该是得⼼应⼿,那么就可以尝试下⽆限级分类列表的制作了。
什么是⽆限级分类?
⽆限级分类是⼀种分类技巧,例如部门组织,⽂章分类,学科分类等常⽤到⽆限级分类,将其简单理解成分类就好了。
其实我们仔细想⼀下,⽣活中的分类简直太多了,⾐服可以分为男装和⼥装,也可以分为上⾐和裤⼦,也可以根据年龄段分类。
分类⽆处不在,分类显
得“⽆限”。
我这⾥就不说⽆限分类的必要性了。
⽆限级分类原理简介
⽆限分类看似"⾼⼤上",实际上原理是⾮常简单的。
⽆限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。
要满⾜⽆限级分类,数据库需要有两个必须的字段,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式的。
直接上效果图了:
下拉列表式导航Link式
实例代码:
我封装了⼀个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('  ',$spac).$row['name'];
$result[]=$row;
$this->getList($row['id'],$result,$spac);
}
return$result;
}
/**
* 展现下拉列表式分类
* @return [type]
*/
public function displayList(){
$rs=$this->getList();
$str="<select name='cate'>";
foreach ($rs as$key => $val) {
$str.="<option >{$val['name']}</option>";
}
$str.="</select>";
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.="<a href=''>{$val['name']}</a>>";
}
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递归函数的原理。