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
相关产品推荐
相关产品推荐

