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

PHP如何高效将带parent_id的平面数组转换为带level标识的树形结构

实现方案

核心思路

采用两次遍历实现,时间复杂度O(n),性能不受数据量大小影响:

  • 第一次遍历构建ID到节点的映射关系,同时给所有父ID为0的根节点设置level为0
  • 第二次遍历处理非根节点,向上追溯父节点的层级,当前节点层级等于父节点层级+1,追溯过程中已计算过的层级会直接复用,不会重复计算

代码实现(PHP)

function generateLevelForTree($originalArray) {
    $nodeMapping = [];
    // 第一次遍历:构建映射、初始化根节点层级
    foreach ($originalArray as &$item) {
        $nodeMapping[$item['id']] = &$item;
        if ($item['parent_id'] == 0) {
            $item['level'] = 0;
        }
    }

    // 第二次遍历:计算所有非根节点的层级
    foreach ($originalArray as &$item) {
        if (!isset($item['level'])) {
            $tempParentId = $item['parent_id'];
            $currentLevel = 0;
            while (isset($nodeMapping[$tempParentId])) {
                $currentLevel++;
                $tempParentId = $nodeMapping[$tempParentId]['parent_id'];
            }
            $item['level'] = $currentLevel;
        }
    }

    unset($item); // 解除引用风险
    return $originalArray;
}

注意事项

你提供的原始示例数组中存在两个ID为38的项,正常业务场景下ID应为唯一主键,如果实际业务中确实存在ID重复的情况,可将映射表的key调整为id + '_' + parent_id或者数组的原始下标即可,整体逻辑不需要改动。返回的结果可直接传入jQgrid使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:07