PHP实现数组转层级HTML树形结构问题求助
问题分析
你的代码无法运行的核心原因有两个:
- 无限递归:构建
$new数组时,你把每个评论都加入到对应parent_id的分组中,包括顶级节点(id等于parent_id的节点),导致递归处理时,顶级节点会不断调用自身,陷入无限循环。 - 顶级节点遗漏:初始调用
createTree时只传入了第一个评论,导致像Comment7这样的其他顶级节点没有被纳入树形结构。
解决方案
下面是修改后的完整代码,修复了上述问题,并能输出你期望的层级格式:
<?php $commentsArray = array( array( 'id' => 1, 'parent_id' => 1, 'content' => 'Comment 1' ), array( 'id' => 2, 'parent_id' => 1, 'content' => 'Comment 2' ), array( 'id' => 3, 'parent_id' => 2, 'content' => 'Comment 3' ), array( 'id' => 4, 'parent_id' => 1, 'content' => 'Comment 4' ), array( 'id' => 5, 'parent_id' => 2, 'content' => 'Comment 5' ), array( 'id' => 6, 'parent_id' => 3, 'content' => 'Comment 6' ), array( 'id' => 7, 'parent_id' => 7, 'content' => 'Comment 7' ), ); // 1. 构建父节点分组,排除顶级节点自身(避免无限递归) $new = array(); foreach ($commentsArray as $comment){ if ($comment['id'] !== $comment['parent_id']) { $new[$comment['parent_id']][] = $comment; } } // 2. 筛选所有顶级节点(id等于parent_id的节点) $topLevelComments = array_filter($commentsArray, function($comment) { return $comment['id'] === $comment['parent_id']; }); // 3. 生成树形结构 $tree = createTree($new, $topLevelComments); // 4. 渲染成期望的层级格式 renderTree($tree); function createTree(&$list, $parent){ $tree = array(); foreach ($parent as $l){ // 如果当前节点有子节点,递归生成子树 if(isset($list[$l['id']])){ $l['children'] = createTree($list, $list[$l['id']]); } $tree[] = $l; } return $tree; } // 递归渲染树形结构为指定格式 function renderTree($tree, $depth = 0){ $prefix = str_repeat('--', $depth); foreach ($tree as $node){ echo ($prefix ? "$prefix " : "") . $node['content'] . "\n"; if(!empty($node['children'])){ renderTree($node['children'], $depth + 1); } } } ?>
关键修改说明
- 避免无限递归:构建
$new数组时,增加判断$comment['id'] !== $comment['parent_id'],防止顶级节点被加入到自身的子节点列表中。 - 包含所有顶级节点:通过
array_filter筛选出所有id等于parent_id的顶级节点,作为树形结构的起始节点,而不是只传入第一个评论。 - 增加渲染函数:新增
renderTree函数,递归生成你期望的带--前缀的层级文本格式,替代原来的print_r输出。
内容的提问来源于stack exchange,提问作者niceddev
相关产品推荐
相关产品推荐

