将扁平数据转换为分层父子结构:PHP 实现教程

将扁平数据转换为分层父子结构:PHP 实现教程

本文详细介绍了如何使用 php 将包含父子关系(如问题与答案)的扁平数组数据,高效地转换为具有清晰层级结构的多维数组。教程将从基础的单层合并方法入手,逐步深入到利用 id 索引和 php 引用构建多层级树状结构的通用解决方案,帮助开发者灵活处理和组织复杂数据。

在数据处理和展示中,我们经常会遇到需要将数据库查询结果或其他来源的扁平数据(即所有记录都在同一层级)转换为具有层级关系(如父子、祖孙)的结构。这种转换对于构建导航菜单、评论系统、组织架构图或问答系统等场景至关重要。本教程将以一个常见的问答数据为例,详细讲解如何在 PHP 中实现这一转换过程。

理解扁平数据结构

假设我们有一个包含问题和答案的扁平数组,每个元素都包含 TYPE(类型)、PARTY_ID(唯一标识符)和 PARENT_USER_CONTENT_ID(父级标识符)。其中,PARENT_USER_CONTENT_ID 为空字符串的表示顶级节点(如问题),非空则表示子节点(如答案),其值指向父节点的 PARTY_ID。

示例输入数据:


即构数智人

即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人36


查看详情
即构数智人

<?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
登录后复制

以上就是将扁平数据转换为分层父子结构:PHP 实现教程的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1677809.html

发表回复

Your email address will not be published. Required fields are marked *