所谓的无极限分类就是一个类可以分成多个子类,然后一个子类又可以分出另外多个子类。
在日常的工作中很多地方都需要用到无极限分类,如评论,网站版块,省市列表等等,下面通过一个简单的例子来实现无极限分类:
首先创建一个数据库:
CREATE TABLE IF NOT EXISTS `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(10),
`name` varchar(50),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
pid 表示父类id;
然后插入一些数据:
INSERT INTO `category`(`id`,`pid`,`name`) VALUES(1,'0','北京'),(2,'1','丰台区'),(3,'1','朝阳区'),(4,'1','通州区'),(5,'1','大兴区'),(6,'1','昌平区'),(7,'1','房山区'),(8,'0','湖南省'),(9,'8','常德市'),(10,'8','长沙市'),(11,'9','武陵区'),(12,'10','雨花区'),(13,'9','石门县'),(14,'9','鼎城区'),(15,'10','望城县'),(16,'0','河南省'),(17,'16','高新区'),(18,'16','中原区'),(19,'17','莲花街')(20,'18','中原大道'),(21,'16','郑大新区');
通过递归的方式实现无极限分类:
<?php
$link=mysql_connect('localhost','root','123456');
if(!$link){
die("连接失败:".mysql_error());
}
mysql_select_db('test') or die("不能连接数据库".mysql_error());
$sql="select * from category";
$query=mysql_query($sql);
if($query){
while(list($id,$pid,$name)=mysql_fetch_row($query)){
static $i=0;
$i++;
$arr[$i]['id']=$id;
$arr[$i]['pid']=$pid;
$arr[$i]['name']=$name;
}
}
function GetTree($arr,$pid,$step){
global $tree;
foreach($arr as $key=>$val) {
if($val['pid'] == $pid) {
$flg = str_repeat('└―',$step);
$val['name'] = $flg.$val['name'];
$tree[] = $val;
GetTree($arr , $val['id'] ,$step+1);
}
}
return $tree;
}
$newarr=GetTree($arr,0,0);
foreach($newarr as $value){
echo $value['name'].'<br>';
}
?>
效果如图: