所谓的无极限分类就是一个类可以分成多个子类,然后一个子类又可以分出另外多个子类。
在日常的工作中很多地方都需要用到无极限分类,如评论,网站版块,省市列表等等,下面通过一个简单的例子来实现无极限分类:
首先创建一个数据库:
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>'; } ?>
效果如图: