You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PHP平级问答数组按ID关联转化为父子层级嵌套结构

PHP平级数组按ID关联转父子层级实现方案

实现逻辑

  • 先以Question的PARTY_ID为键,把所有Question存入临时索引数组,避免后续匹配Answer时重复遍历父级,可直接定位到对应父元素
  • 遍历所有Answer元素,根据PARENT_USER_CONTENT_ID匹配到对应Question后,直接追加到Question的子元素位置
  • 最后提取索引数组的所有值,即可得到目标层级结构

完整实现代码

带children字段版(更易维护,推荐)

$start_array = [
    [
        'TYPE' => 'Question',
        'PARTY_ID' => 112,
        'PARENT_USER_CONTENT_ID' => ''
    ],
    [
        'TYPE' => 'Anwser',
        'PARTY_ID' => 115,
        'PARENT_USER_CONTENT_ID' => 112
    ]
];

// 构建Question索引数组
$questionIndex = [];
foreach ($start_array as $item) {
    if ($item['TYPE'] === 'Question') {
        // 初始化子元素容器
        $item['children'] = [];
        $questionIndex[$item['PARTY_ID']] = $item;
    }
}

// 匹配Answer挂载到对应Question下
foreach ($start_array as $item) {
    if ($item['TYPE'] === 'Anwser' && isset($questionIndex[$item['PARENT_USER_CONTENT_ID']])) {
        $questionIndex[$item['PARENT_USER_CONTENT_ID']]['children'][] = $item;
    }
}

// 转为索引数组输出
$new_array = array_values($questionIndex);
print_r($new_array);

完全匹配你示例的输出版本(无children字段)

如果不需要单独的子元素字段,要和你给出的期望结构完全一致,只需要修改Answer挂载的逻辑即可:

// 替换上面的Answer挂载逻辑
foreach ($start_array as $item) {
    if ($item['TYPE'] === 'Anwser' && isset($questionIndex[$item['PARENT_USER_CONTENT_ID']])) {
        $questionIndex[$item['PARENT_USER_CONTENT_ID']][] = $item;
    }
}

内容的提问来源于stack exchange,提问作者user17516027

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:57:02