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格式数据