解析PHP无限级分类方法及代码
在网站开发中,分类列表是常见的需要处理的数据类型,其中涉及到无限级分类问题。在PHP语言中,常见的有两种方式实现无限级分类,分别为递归和非递归方法。
递归实现无限级分类
递归实现是常见的无限级分类方法,主要思路是从顶级分类开始,逐级遍历下一级分类,直到最底层的子分类全部遍历完。
下面是一个递归实现无限级分类的PHP代码示例:
function get_categories($parent_id = 0) {
global $pdo; //PDO对象
$sql = "SELECT * FROM categories WHERE parent_id = :parent_id ORDER BY name ASC";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':parent_id', $parent_id, PDO::PARAM_INT);
$stmt->execute();
$categories = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$children = get_categories($row['id']);
$row['children'] = $children;
$categories[] = $row;
}
return $categories;
}
解释:在该示例中, $parent_id
参数用于指定当前分类的父级ID,默认为0即第一级分类。通过数据库的查询语句获取该分类下的所有子分类,然后通过递归调用get_categories()
来获取下一级分类。将获取到的所有子分类存放到当前分类的$children
属性中,最后将当前分类对象加入到$categories
数组中。
非递归实现无限级分类
非递归实现无限级分类是基于树形结构的深度优先遍历算法实现的。在这种方法中,使用了栈数据结构来存储待处理的节点,然后不断从栈中弹出节点进行处理,直到所有节点都被处理完。
下面是非递归实现无限级分类的PHP代码示例:
function get_categories($parent_id = 0) {
global $pdo; //PDO对象
$sql = "SELECT * FROM categories WHERE parent_id = :parent_id ORDER BY name ASC";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':parent_id', $parent_id, PDO::PARAM_INT);
$stmt->execute();
$categories = array();
$stack = array();
while (true) {
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$stack[] = $row;
}
if (empty($stack)) {
break;
}
$row = array_pop($stack);
$children = get_categories($row['id']);
$row['children'] = $children;
$categories[] = $row;
}
return $categories;
}
解释:在该示例中,使用一个栈数据结构来存放待处理的节点,遍历所有子节点并将其加入到栈中。当栈为空时,说明所有节点都已经被处理完,退出循环。在处理每个节点时,使用get_categories()
递归获取其所有子节点,然后将当前节点存放到$categories
数组中。
示例说明
假设有以下商品分类列表:
- 电脑
- 台式电脑
- 普通台式电脑
- 高端台式电脑
- 笔记本电脑
- 普通笔记本电脑
- 高端笔记本电脑
- 手机
- 普通手机
- 高端手机
可以通过调用get_categories()
函数来处理该数据:
$categories = get_categories();
print_r($categories);
输出结果如下:
Array
(
[0] => Array
(
[id] => 1
[name] => 电脑
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[id] => 2
[name] => 台式电脑
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[id] => 3
[name] => 普通台式电脑
[parent_id] => 2
[children] => Array
(
)
)
[1] => Array
(
[id] => 4
[name] => 高端台式电脑
[parent_id] => 2
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 5
[name] => 笔记本电脑
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[id] => 6
[name] => 普通笔记本电脑
[parent_id] => 5
[children] => Array
(
)
)
[1] => Array
(
[id] => 7
[name] => 高端笔记本电脑
[parent_id] => 5
[children] => Array
(
)
)
)
)
)
)
[1] => Array
(
[id] => 8
[name] => 手机
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[id] => 9
[name] => 普通手机
[parent_id] => 8
[children] => Array
(
)
)
[1] => Array
(
[id] => 10
[name] => 高端手机
[parent_id] => 8
[children] => Array
(
)
)
)
)
)
从结果中可以看出,该函数将分类列表以数组的形式返回,同时每个分类对象包含了其子分类的数组,以实现无限级分类的处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析PHP无限级分类方法及代码 - Python技术站