如何将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
相关产品推荐
相关产品推荐

