
本文详细介绍了如何使用 php 将包含父子关系(如问题与答案)的扁平数组数据,高效地转换为具有清晰层级结构的多维数组。教程将从基础的单层合并方法入手,逐步深入到利用 id 索引和 php 引用构建多层级树状结构的通用解决方案,帮助开发者灵活处理和组织复杂数据。
在数据处理和展示中,我们经常会遇到需要将数据库查询结果或其他来源的扁平数据(即所有记录都在同一层级)转换为具有层级关系(如父子、祖孙)的结构。这种转换对于构建导航菜单、评论系统、组织架构图或问答系统等场景至关重要。本教程将以一个常见的问答数据为例,详细讲解如何在 PHP 中实现这一转换过程。
理解扁平数据结构
假设我们有一个包含问题和答案的扁平数组,每个元素都包含 TYPE(类型)、PARTY_ID(唯一标识符)和 PARENT_USER_CONTENT_ID(父级标识符)。其中,PARENT_USER_CONTENT_ID 为空字符串的表示顶级节点(如问题),非空则表示子节点(如答案),其值指向父节点的 PARTY_ID。
示例输入数据:
<?php $flatData = [ [ 'TYPE' => 'Answer', 'PARTY_ID' => 115, 'PARENT_USER_CONTENT_ID' => 112 ], [ 'TYPE' => 'Question', 'PARTY_ID' => 112, 'PARENT_USER_CONTENT_ID' => '' ], [ 'TYPE' => 'Question', 'PARTY_ID' => 113, 'PARENT_USER_CONTENT_ID' => '' ], [ 'TYPE' => 'Answer', 'PARTY_ID' => 116, 'PARENT_USER_CONTENT_ID' => 113 ], [ 'TYPE' => 'Question', 'PARTY_ID' => 114, 'PARENT_USER_CONTENT_ID' => '' ], [ 'TYPE' => 'Answer', 'PARTY_ID' => 117, 'PARENT_USER_CONTENT_ID' => 112 ], // 112 的第二个答案 [ 'TYPE' => 'Answer', 'PARTY_ID' => 118, 'PARENT_USER_CONTENT_ID' => 113 ], // 113 的第二个答案 [ 'TYPE' => 'Comment', 'PARTY_ID' => 119, 'PARENT_USER_CONTENT_ID' => 115 ], // 115 的子评论 (多层级) ]; ?>
我们的目标是将上述扁平数据转换为如下所示的层级结构:
立即学习“PHP免费学习笔记(深入)”;
<?php /* Array ( [0] => Array ( [TYPE] => Question [PARTY_ID] => 112 [PARENT_USER_CONTENT_ID] => [children] => Array // 嵌套的子节点 ( [0] => Array ( [TYPE] => Answer [PARTY_ID] => 115 [PARENT_USER_CONTENT_ID] => 112 [children] => Array // 更深层级的子节点 ( [0] => Array ( [TYPE] => Comment [PARTY_ID] => 119 [PARENT_USER_CONTENT_ID] => 115 ) ) ) [1] => Array ( [TYPE] => Answer [PARTY_ID] => 117 [PARENT_USER_CONTENT_ID] => 112 ) ) ) // ... 其他问题及其答案 ) */ ?>
方法一:基于 ID 索引的单层父子合并(适用于单一子节点场景)
这种方法适用于父节点只有一个直接子节点,或者我们只关心将第一个匹配的子节点合并到父节点的情况。它利用 PHP 数组函数进行高效处理。
<?php $arr = [ [ 'TYPE' => 'Answer', 'PARTY_ID' => 115, 'PARENT_USER_CONTENT_ID' => 114 ], [ 'TYPE' => 'Question', 'PARTY_ID' => 112, 'PARENT_USER_CONTENT_ID' => '' ], [ 'TYPE' => 'Question', 'PARTY_ID' => 113, 'PARENT_USER_CONTENT_ID' => '' ], [ 'TYPE' => 'Answer', 'PARTY_ID' => 116, 'PARENT_USER_CONTENT_ID' => 113 ], [ 'TYPE' => 'Question', 'PARTY_ID' => 114, 'PARENT_USER
暂无评论


