You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP将扁平菜单数组转换为不限层级的树形结构?

不限层级菜单树转换实现方案

你现有代码的问题在于仅会在根节点数组中查找父节点,当子节点层级超过2级时,其父节点已经处于嵌套结构中,无法在根数组中匹配到,因此会出现异常。

以下是支持任意层级的实现方案,时间复杂度为O(n),无需递归即可完成转换:

function buildMenuTree(array $menu): array
{
    // 先创建以ID为键的节点索引,存储所有节点的引用
    $indexedNodes = [];
    foreach ($menu as $node) {
        $indexedNodes[$node['id']] = $node;
        // 提前初始化child字段,避免后续赋值报错
        if (!isset($indexedNodes[$node['id']]['child'])) {
            $indexedNodes[$node['id']]['child'] = [];
        }
    }

    $tree = [];
    foreach ($indexedNodes as $node) {
        $parentId = $node['parent_id'];
        if ($parentId == 0) {
            // 根节点直接加入结果树
            $tree[] = $node;
        } else {
            // 非根节点直接挂载到对应父节点的child数组
            $indexedNodes[$parentId]['child'][] = $node;
        }
    }

    // 可选:如果不需要保留无子女节点的空child字段,加下面这行
    // $tree = filterEmptyChild($tree);

    return $tree;
}

// 可选:清理空child字段的辅助函数
function filterEmptyChild(array $nodes): array
{
    foreach ($nodes as &$node) {
        if (!empty($node['child'])) {
            $node['child'] = filterEmptyChild($node['child']);
        } else {
            unset($node['child']);
        }
    }
    return $nodes;
}

实现逻辑说明

  • 先通过ID索引所有节点,不管层级高低都能O(1)效率定位到父节点,不需要逐层遍历嵌套结构
  • 节点操作基于引用修改,挂载子节点时修改索引项就能同步到树结构中的对应节点
  • 不受层级深度限制,只要菜单的parent_id关联正确,任意层级都能正常生成嵌套结构

内容的提问来源于stack exchange,提问作者TangoMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:27:02