解析PHP无限级分类方法及代码

在网站开发中,分类列表是常见的需要处理的数据类型,其中涉及到无限级分类问题。在PHP语言中,常见的有两种方式实现无限级分类,分别为递归和非递归方法。

解析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无限级分类方法及代码

基础教程推荐