TypechoJoeTheme

Dcr163的博客

统计

PHP生成无限级菜单

2025-12-25
/
0 评论
/
1,736 阅读
/
正在检测是否收录...
12/25

生成无限级菜单 O(n) —— 只遍历数据 两次(建 map + 挂载),每次 O(1) 查父节点 ,pid为父id,关系

直接上代码:

 /**
     * 生成无限级菜单 O(n) —— 只遍历数据 两次(建 map + 挂载),每次 O(1) 查父节点 ,pid为父id,关系
     * @return void
     */
    public function index()
    {
        //基础数据
        $baseData = [
            ['id' => 1, 'pid' => 0, 'name' => 'a1'],
            ['id' => 2, 'pid' => 1, 'name' => 'a2'],
            ['id' => 3, 'pid' => 1, 'name' => 'a3'],
            ['id' => 4, 'pid' => 2, 'name' => 'a4'],
            ['id' => 5, 'pid' => 3, 'name' => 'a5'],
            ['id' => 6, 'pid' => 3, 'name' => 'a6'],
            ['id' => 7, 'pid' => 0, 'name' => 'B1'],
        ];
        //map建立哈希映射,根据id保存数据
        $nodeMap = [];
        foreach ($baseData as $data) {
            $nodeMap[$data['id']] = $data;
            $nodeMap[$data['id']]['child'] = [];
        }
        //树形数据
        $tree = [];
        //处理map数据,需要用&引用数据的方式
        foreach ($nodeMap as &$data) {
            if ($data['pid'] == 0) {
                //当没有上级直接添加到树形结构
                $tree[] = &$data;
            } else {
                //存在pid的时候再放到父级的child字段中
                if ($data['pid'] && isset($nodeMap[$data['pid']])) {
                    $nodeMap[$data['pid']]['child'][] = &$data;
                }
            }
        }
        //打印数据结构
        dd($tree);
    }

效果如图所示

朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

http://dcr163.cn/772.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去天
本月已经过去天
今年已经过去个月

最新回复

  1. blowjob
    2026-07-19
  2. バイナリー 取引ツール
    2026-07-11
  3. http://www.annunciogratis.net/author/oevsandra54
    2026-05-31
  4. web page
    2026-04-10
  5. plenty of insightful
    2026-03-19

标签云