php做项目会用到无限分类,也就是说父分类可以创建子分类,子分类可以再创建子分类,如此循环下去……
今天总结一下PHP递归算法实现无限分类的实操,好记性不如烂笔头。
递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据。
创建 Mysql 数据表
首先准备数据表 class,并插入几条示例分类信息。
字段注释:
id分类编号,自动增长;
pid所属父类id;
title分类名称。
class 数据表结构:
CREATE TABLEIFNOTEXISTS`class` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '分类id',
`pid` INT(11) NOT NULL COMMENT '父类id',
`title` VARCHAR(25) COLLATE 'utf8_general_ci' NOT NULL COMMENT '分类名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
//插入父类:名称为 ‘新闻’,pid设为0,id自动增长可留空
INSERT INTO `class` (`id`, `pid`, `title`) VALUES (1, 0, '新闻');
//插入一级子类 ‘国内新闻’,其父类‘新闻’的id是1,所以它的pid设置为1
INSERT INTO `class` (`id`, `pid`, `title`) VALUES (2, 1, '国内新闻');
//插入二级子类 ‘图片’,其父类‘国内新闻’的id是2,所以它的pid设置为2
INSERT INTO `class` (`id`, `pid`, `title`) VALUES (3, 2, '图片');
…………
连接 MySQL
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '', 'data_name') ;
if(mysqli_connect_errno()){
echo '链接失败: '.mysqli_connect_error();
exit();
}
$db->query('set names utf8');
$result = $db->query('SELECT * FROM `class`');
PHP 无限分类
自定义函数,返回数组。
functionget_array($id=0){
$sql="selectid,titlefromclasswherepid=$id";
$result=mysql_query($sql);//查询子类
$arr=array();
if($result&&mysql_affected_rows()){//如果有子类
while($rows=mysql_fetch_assoc($result)){//循环记录集
$rows['list']=get_array($rows['id']);//调用函数,传入参数,继续查询下级
$arr[]=$rows;//组合数组
}
return$arr;
}
}
get_array() 返回数组,可以将数组转换成json格式传递给前端页面灵活运用,比如树形列表,下拉列表等。
$list=get_array(0);//调用函数
print_r($list);//输出数组
echojson_encode($list); //输出json格式数据