以下是「PHP实现无限极分类生成分类树的方法」的完整攻略。
什么是无限极分类
无限极分类是指分类下还可再细分出同级别的子分类,进而无限循环有无限级别的分类。
举个例子来说,假设“商品分类”有如下结构:
- 服饰
- 男装
- 衬衫
- 单色衬衫
- 领结衬衫
- 西装
- T恤
- 女装
- 连衣裙
- 花裤子
- 食品
- 奶类
- 水果
- 苹果
- 香蕉
以上结构可视为无限极分类。现在需要写 PHP 代码来将这样一份分类转化为在浏览器中显示的分类树。
无限极分类实现方法
方法一:递归实现
递归是实现无限极分类的最常用方法,具体方式是将所需的无限分类数据在一次循环中转化为了树形数据。该方法可在无限级别分类下的任意类别下添加子类别。
/**
* 递归方法:生成分类树
* @param $categoryArr 目标分类数组
* @param $parentId 当前分类的父级ID
* @return array 以多维数组形式返回分类树
*/
function buildCategoryTree($categoryArr, $parentId = 0) {
$tree = array();
foreach($categoryArr as $key => $category) {
if ($category['parent_id'] == $parentId) {
$tree[] = array(
'id' => $category['id'],
'name' => $category['name'],
'child' => buildCategoryTree($categoryArr, $category['id']),
);
}
}
return $tree;
}
该方法通过一个递归函数 buildCategoryTree,实现了将当前分类及其子分类列表渲染到 HTML 中。这里传入的 $categoryArr 为目标分类数组,$parentId 为当前分类的父级ID,初始默认设为0。
方法二:使用迭代器实现
PHP中的 Iterator 接口提供了 Iterator 对象,该对象实现对迭代器对象的一页一页或单个单个管理。
该方法与递归方法类似,通常使用无限极分类数组重排的方式生成一个树形数组。由于迭代器特别适用于处理较大的数据集,因此该方法可保持代码的封装性,并且速度较快。
以下是迭代器实现的分类树方法部分代码:
/**
* 迭代器实现方法:将分类数组转换成分类树数组
* @param array $data 原始分类数组
* @return array 以多维数组形式返回分类树
*/
function buildTree(array $data) {
$map = array();
$tree = array();
foreach ($data as &$vo) {
$map[$vo['id']] = &$vo;
$map[$vo['id']]['child'] = array();
}
unset($vo);
foreach ($data as &$vo) {
$parent = &$map[$vo['parent_id']];
empty($parent) ? ($tree[] = &$vo) : ($parent['child'][] = &$vo);
}
unset($vo);
unset($map);
return $tree;
}
示例说明
以下以“商品分类”为例演示两条无限极分类实现方法。
示例一:递归实现
假设“商品分类”表包含如下数据:
id | name | parent_id |
---|---|---|
1 | 服饰 | 0 |
2 | 男装 | 1 |
3 | 衬衫 | 2 |
4 | 西装 | 2 |
5 | 女装 | 1 |
6 | 电器 | 0 |
7 | 冰箱 | 6 |
8 | 洗衣机 | 6 |
传入原始分类数据,执行递归分类,得到以下数据输出:
$data = array(
array('id'=>1,'name'=>'服饰','parent_id'=>0),
array('id'=>2,'name'=>'男装','parent_id'=>1),
array('id'=>3,'name'=>'衬衫','parent_id'=>2),
array('id'=>4,'name'=>'西装','parent_id'=>2),
array('id'=>5,'name'=>'女装','parent_id'=>1),
array('id'=>6,'name'=>'电器','parent_id'=>0),
array('id'=>7,'name'=>'冰箱','parent_id'=>6),
array('id'=>8,'name'=>'洗衣机','parent_id'=>6),
);
$treeList = buildCategoryTree($data);
echo '<pre>';
print_r($treeList);
echo '</pre>';
输出结果:
Array
(
[0] => Array
(
[id] => 1
[name] => 服饰
[child] => Array
(
[0] => Array
(
[id] => 2
[name] => 男装
[child] => Array
(
[0] => Array
(
[id] => 3
[name] => 衬衫
[child] => Array
(
[0] => Array
(
[id] => 4
[name] => 西装
[child] => Array
(
)
)
)
)
[1] => Array
(
[id] => 4
[name] => 西装
[child] => Array
(
)
)
)
)
[1] => Array
(
[id] => 5
[name] => 女装
[child] => Array
(
)
)
)
)
[1] => Array
(
[id] => 6
[name] => 电器
[child] => Array
(
[0] => Array
(
[id] => 7
[name] => 冰箱
[child] => Array
(
)
)
[1] => Array
(
[id] => 8
[name] => 洗衣机
[child] => Array
(
)
)
)
)
)
示例二:使用迭代器实现
假设我们有一个函数 getList 可以根据传入的分类ID查询该分类下的所有子分类以及子分类的子分类。
/**
* 获取商品分类信息
*/
function getList($id){
$map['parent_id'] = $id;
return M('GoodsCategory')->where($map)->select();
}
接下来调用 buildTree 函数即可实现无限极分类生成分类树的功能。
/**
* 利用迭代器,生成分类树
*/
function buildTree($parentId = 0){
$data = getList($parentId);
$tree = $this->buildTreeByList($data);
foreach ($tree as &$item) {
$item['children'] = $this->buildTree($item['id']);
if (empty($item['children'])) {
unset($item['children']);
}
}
return $tree;
}
以上是“PHP实现无限极分类生成分类树的方法”的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现无限极分类生成分类树的方法 - Python技术站