浅谈PHP无限极分类原理
什么是无限极分类
无限极分类是指一个分类的层级数不确定,随着数据的增加,分类的层级数可能会不断增加。类似于“树”的结构,每个分类可以有多个子分类,每个子分类又可以有多个孙分类,一直延伸下去,直到最后一层分类。
实现无限极分类
实现无限极分类的方法主要有两种:
递归算法
递归算法是指在函数内部调用自身的一种算法。在实现无限极分类的时候,可以通过递归算法来实现:
/**
* 递归获取分类树
*
* @param array $list 排序后的分类列表
* @param int $parentId 父分类id
* @param int $level 分类层级
* @return array
*/
function getTree($list, $parentId = 0, $level = 0) {
// 定义存放子分类的数组
$tree = array();
foreach ($list as $key => $value) {
if ($value['parent_id'] == $parentId) {
// 设置当前分类的层级
$value['level'] = $level;
// 递归获取子分类
$value['children'] = getTree($list, $value['id'], $level + 1);
// 将分类放入分类树中
$tree[] = $value;
}
}
return $tree;
}
递归算法的核心思想是不断调用自身,直到满足退出条件才停止递归。
遍历算法
遍历算法是指通过循环遍历父分类和子分类的关系来获取分类树。在实现无限极分类的时候,可以通过遍历算法来实现:
/**
* 遍历获取分类树
*
* @param array $list 排序后的分类列表
* @return array
*/
function getTree($list) {
// 定义存放分类树的数组
$tree = array();
foreach ($list as $key => $value) {
if ($value['parent_id'] == 0) {
// 一级分类直接放入分类树中
$tree[] = $value;
} else {
// 遍历分类树查找父分类
foreach ($tree as $k => $v) {
if ($v['id'] == $value['parent_id']) {
// 将当前分类作为子分类放入父分类中
$tree[$k]['children'][] = $value;
} else {
// 遍历子分类查找父分类
foreach ($v['children'] as $kk => $vv) {
if ($vv['id'] == $value['parent_id']) {
// 将当前分类作为子分类放入父分类中
$tree[$k]['children'][$kk]['children'][] = $value;
}
}
}
}
}
}
return $tree;
}
遍历算法的核心思想是通过循环遍历分类列表,找到每个分类的父分类以及其下的子分类,然后将分类树构建出来。
示例说明
下面通过两个示例来说明如何实现无限极分类:
示例1
假设有以下分类表结构:
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类id',
`name` varchar(50) NOT NULL COMMENT '分类名',
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分类表';
分类表中有4个分类,其中电脑为一级分类,笔记本和台式机为二级分类,游戏本为三级分类。
INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES
(1, '电脑', 0),
(2, '笔记本', 1),
(3, '台式机', 1),
(4, '游戏本', 2);
可以使用如下代码获取分类树:
$list = array(
array('id' => 1, 'name' => '电脑', 'parent_id' => 0),
array('id' => 2, 'name' => '笔记本', 'parent_id' => 1),
array('id' => 3, 'name' => '台式机', 'parent_id' => 1),
array('id' => 4, 'name' => '游戏本', 'parent_id' => 2)
);
$tree = getTree($list);
获取到的分类树为:
array(
array(
'id' => 1,
'name' => '电脑',
'parent_id' => 0,
'level' => 0,
'children' => array(
array(
'id' => 2,
'name' => '笔记本',
'parent_id' => 1,
'level' => 1,
'children' => array(
array(
'id' => 4,
'name' => '游戏本',
'parent_id' => 2,
'level' => 2,
'children' => array()
)
)
),
array(
'id' => 3,
'name' => '台式机',
'parent_id' => 1,
'level' => 1,
'children' => array()
)
)
)
)
示例2
假设有以下分类表结构:
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类id',
`name` varchar(50) NOT NULL COMMENT '分类名',
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分类表';
分类表中有6个分类,其中A、B和C为一级分类,D、E和F为二级分类,其中D和E的上级分类为A,F的上级分类为B。
INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES
(1, 'A', 0),
(2, 'B', 0),
(3, 'C', 0),
(4, 'D', 1),
(5, 'E', 1),
(6, 'F', 2);
可以使用如下代码获取分类树:
$list = array(
array('id' => 1, 'name' => 'A', 'parent_id' => 0),
array('id' => 2, 'name' => 'B', 'parent_id' => 0),
array('id' => 3, 'name' => 'C', 'parent_id' => 0),
array('id' => 4, 'name' => 'D', 'parent_id' => 1),
array('id' => 5, 'name' => 'E', 'parent_id' => 1),
array('id' => 6, 'name' => 'F', 'parent_id' => 2)
);
$tree = getTree($list);
获取到的分类树为:
array(
array(
'id' => 1,
'name' => 'A',
'parent_id' => 0,
'level' => 0,
'children' => array(
array(
'id' => 4,
'name' => 'D',
'parent_id' => 1,
'level' => 1,
'children' => array()
),
array(
'id' => 5,
'name' => 'E',
'parent_id' => 1,
'level' => 1,
'children' => array()
)
)
),
array(
'id' => 2,
'name' => 'B',
'parent_id' => 0,
'level' => 0,
'children' => array(
array(
'id' => 6,
'name' => 'F',
'parent_id' => 2,
'level' => 1,
'children' => array()
)
)
),
array(
'id' => 3,
'name' => 'C',
'parent_id' => 0,
'level' => 0,
'children' => array()
)
)
总结
无限极分类是一种常用的分类方式,实现方法比较灵活,可以根据具体的业务场景来选择采用递归算法还是遍历算法。无论采用哪种方法,都需要对分类表进行排序,以便更好的构建分类树。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP无限极分类原理 - Python技术站