PHP递归算法实现无限分类

php做项目会用到无限分类,也就是说父分类可以创建子分类,子分类可以再创建子分类,如此循环下去……

今天总结一下PHP递归算法实现无限分类的实操,好记性不如烂笔头。

递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据。

创建 Mysql 数据表

首先准备数据表 class,并插入几条示例分类信息。

字段注释:

id	分类编号,自动增长;
pid	所属父类id;
title	分类名称。

class 数据表结构:

CREATE TABLE IF NOT EXISTS `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 无限分类

自定义函数,返回数组。

function get_array($id=0){
	$sql = "select id,title from class where pid= $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); //输出数组
echo json_encode($list); //输出json格式数据