
本文详细阐述了如何使用 php 数组操作,将扁平化的数据结构转换为具有层级关系的父子结构。通过索引、筛选和合并等步骤,实现将子元素(如答案)嵌套到其对应的父元素(如问题)之下,从而优化数据的组织和可读性,适用于处理如问答系统等场景中的关联数据。
在许多应用场景中,我们经常会遇到需要将数据库查询结果或其他扁平化数据转换为具有层级关系的结构。例如,一个问答系统可能将问题和答案存储在同一个表中,并通过 ID 关联。本教程将展示如何利用 PHP 的数组处理函数,将一个包含问题和答案的扁平数组,转换为一个父子嵌套的层级结构。
假设我们有一个包含 TYPE (类型,如 'Question' 或 'Answer')、PARTY_ID (唯一标识符) 和 PARENT_USER_CONTENT_ID (父级 ID) 的数组。其中,问题的 PARENT_USER_CONTENT_ID 为空,而答案的 PARENT_USER_CONTENT_ID 则指向其对应问题的 PARTY_ID。
原始扁平数据示例:
$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_CONTENT_ID' => '' ],
    [ 'TYPE' => 'Answer', 'PARTY_ID' => 117, 'PARENT_USER_CONTENT_ID' => 112 ]
];期望的层级结构示例:
立即学习“PHP免费学习笔记(深入)”;
Array (
  [0] => Array (
    [TYPE] => 'Question',
    [PARTY_ID] => 112,
    [PARENT_USER_CONTENT_ID] => '',
    [ANSWER] => Array ( // 注意这里的键名 'ANSWER'
      [TYPE] => 'Answer',
      [PARTY_ID] => 117,
      [PARENT_USER_CONTENT_ID] => 112
    )
  )
  // ... 其他问题及其答案
)我们的目标是将每个答案作为其对应问题的一个子元素,嵌套在问题数组内部。
实现这一转换的核心思路是:
下面是实现上述逻辑的 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_CONTENT_ID' => '' ],
    [ 'TYPE' => 'Answer', 'PARTY_ID' => 117, 'PARENT_USER_CONTENT_ID' => 112 ]
];
// 1. 创建一个以 PARTY_ID 为键的索引数组,方便快速查找
// array_column($arr, 'PARTY_ID') 提取所有 PARTY_ID 作为新数组的键
// $arr 作为新数组的值
$indexed = array_combine(array_column($arr, 'PARTY_ID'), $arr);
// 2. 识别父子关系:构建一个映射,键是父ID,值是子ID
// array_column($arr, 'PARENT_USER_CONTENT_ID', 'PARTY_ID') 提取所有 PARENT_USER_CONTENT_ID,并以 PARTY_ID 为键
// array_filter 过滤掉 PARENT_USER_CONTENT_ID 为空(即问题本身)的项
// array_flip 交换键和值,使得父ID成为键,子ID成为值
$answers = array_flip(array_filter(array_column($arr, 'PARENT_USER_CONTENT_ID', 'PARTY_ID')));
$result = []; // 存储最终的层级结构
// 3. 遍历父子关系,将答案合并到对应的问题中
foreach ($answers as $parentPartyId => $childPartyId) {
    // 从 $indexed 中获取父元素(问题)和子元素(答案)的完整数据
    $parent = $indexed[$parentPartyId];
    $child = $indexed[$childPartyId];
    // 将子元素作为父元素的一个子数组合并,键名为 'ANSWER'
    $result[] = array_merge($parent, [ 'ANSWER' => $child ]);
}
print_r($result);
?>$indexed = array_combine(array_column($arr, 'PARTY_ID'), $arr);
$answers = array_flip(array_filter(array_column($arr, 'PARENT_USER_CONTENT_ID', 'PARTY_ID')));
foreach ($answers as $parentPartyId => $childPartyId) { ... }
通过上述 PHP 数组操作技巧,我们可以高效地将扁平化的关联数据转换为清晰的层级结构。这种方法利用了 array_combine、array_column、array_filter 和 array_flip 等强大函数,避免了复杂的循环和条件判断,使得代码简洁且易于理解。掌握这些技巧对于处理各种数据组织和转换任务都非常有益。
以上就是PHP 实践:构建基于 ID 的父子关系数据结构的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号