ThinkPHP无限级分类(递归)

代码演示#

没什么可说的直接看代码

<?php
namespace app\controller;
class Category
{
    //模拟假数据
    protected static function arr()
    {
        $rows = [
            [
                'id' => '1',
                'name' => '一级菜单',
                'pid' => '0',
                'path' => '0',
            ],
            [
                'id' => '2',
                'name' => '二级菜单',
                'pid' => '0',
                'path' => '0',
            ],
            [
                'id' => '3',
                'name' => '一级菜单-1',
                'pid' => '1',
                'path' => '0-1',
            ],
            [
                'id' => '4',
                'name' => '二级菜单-1',
                'pid' => '2',
                'path' => '0-2',
            ],
            [
                'id' => '5',
                'name' => '一级菜单-1-1',
                'pid' => '3',
                'path' => '0-1-3',
            ],
            [
                'id' => '6',
                'name' => '二级菜单-1-1',
                'pid' => '4',
                'path' => '0-2-4',
            ],
            [
                'id' => '7',
                'name' => '二级菜单-1-2',
                'pid' => '4',
                'path' => '0-2-4',
            ],
            [
                'id' => '8',
                'name' => '三级菜单',
                'pid' => '0',
                'path' => '0',
            ],
            [
                'id' => '9',
                'name' => '二级菜单-1-3',
                'pid' => '4',
                'path' => '0-2-4-6',
            ],
            [
                'id' => '10',
                'name' => '三级菜单-1',
                'pid' => '8',
                'path' => '0-8',
            ],
            [
                'id' => '11',
                'name' => '一级菜单-1-4',
                'pid' => '5',
                'path' => '0-8',
            ],
        ];
        return $rows;
    }

    public function index()
    {
        //获取从第0级下的所有分类(pid==0)
        $list = $this->build_tree(0);
        return json($list);
    }

    /**
     * 递归子级
     * @param $list
     * @param $id
     * @return array
     */
    public function findChild($list, $id)
    {
        $child = [];
        foreach ($list as $key => $item) {
            //如果pid等于传进来
            if ($item['pid'] == $id) {
                $child[] = $item;
            }
        }
        return $child;
    }
    /**
     * 获取当前级别的子级
     * @param $root_id /第几层
     * @return null
     */
    public function build_tree($root_id)
    {
        //获取假数据
        $list = $this->arr();
        //查找指定级数
        $tree = $this->findChild($list, $root_id);
        if (empty($tree)) {
            return null;
        }
        //遍历获取到的层级得到下级分类
        foreach ($tree as $key => $item) {
            //递归调用自己 查找每个元素下的分类
            $child = $this->build_tree($item['id']);
            //如果有子类就放入数组中
            if ($child != null){
                $tree[$key]['child'] = $child;
            }
        }
        return $tree;
    }
} 

预览结果#

image

posted @   白日醒梦  阅读(349)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩