PHP如何按数组的external_account字段值对数据进行聚合?
原有代码问题梳理
- 冗余的双重循环:无需嵌套两次遍历原数组,单轮遍历即可完成聚合,O(n²)的时间复杂度远高于单轮遍历的O(n)
- 数据结构拼接错误:
array_push操作单独插入label和value两个独立值,而非你需要的['label' => xx, 'value' => xx]结构,直接导致data字段内容格式不符合要求 - 变量未初始化风险:
$valeur仅在if条件命中时才赋值,未命中时会抛出未定义变量的警告 - 冗余数据插入:
$data的赋值逻辑放在内层循环体内,每轮内层循环都会插入一条数据,最终会产生大量重复的无效条目 - 遍历过程中修改原数组:遍历
$result的同时unset其元素,会导致遍历异常,遗漏部分数据
正确实现代码
使用临时关联数组做聚合索引,单轮遍历即可完成需求,代码如下:
// 临时关联数组,以external_account为键做聚合索引 $temp = []; foreach ($result as $item) { $account = $item['external_account']; // 首次遇到该账号时初始化结构 if (!isset($temp[$account])) { $temp[$account] = [ 'external_account' => $account, 'data' => [] ]; } // 向对应账号的data字段插入符合格式的条目 $temp[$account]['data'][] = [ 'label' => $item['label'], 'value' => $item['value'] ]; } // 将关联数组转为索引数组,得到最终输出 $finalResult = array_values($temp);
内容的提问来源于stack exchange,提问作者testooo
相关产品推荐
相关产品推荐

