PHP多维数组合并去重:同名账户数据合并与重复项过滤
解决PHP合并同name账户数据并去重的问题
别担心,我来帮你一步步实现这个需求!你的核心目标是把数组中name相同的项合并,并且过滤掉accounts里的重复条目,我们可以在你现有代码的基础上,加上分组和去重的逻辑,具体实现如下:
完整代码实现
// 1. 先执行你现有的预处理逻辑,清理不需要的字段 $processedArray = array_map(function($tmp) { unset($tmp['total_net_movement']); if (isset($tmp['accounts'])) { foreach ($tmp['accounts'] as $key => $value) { unset($value['net_movement']); $tmp['accounts'][$key] = $value; } } return $tmp; }, $array); // 2. 按`name`分组,合并相同name下的所有accounts数据 $groupedData = []; foreach ($processedArray as $item) { $accountName = $item['name']; // 如果该name还未创建分组,先初始化结构 if (!isset($groupedData[$accountName])) { $groupedData[$accountName] = [ 'name' => $accountName, 'accounts' => [] ]; } // 把当前item的accounts合并到对应分组中 $groupedData[$accountName]['accounts'] = array_merge( $groupedData[$accountName]['accounts'], $item['accounts'] ); } // 3. 对每个分组的accounts按`id`去重(如果需要按code去重,替换成$account['code']即可) foreach ($groupedData as &$group) { $uniqueAccounts = []; foreach ($group['accounts'] as $account) { // 利用数组键名的唯一性自动去重 $uniqueAccounts[$account['id']] = $account; } // 转回索引数组,符合期望的输出格式 $group['accounts'] = array_values($uniqueAccounts); } // 4. 把分组后的关联数组转换为索引数组,得到最终结果 $result = array_values($groupedData); // 查看结果 print_r($result);
代码逻辑拆解
- 预处理阶段:保留你原本的代码,负责清理掉不需要的字段(
total_net_movement和net_movement),确保后续处理的数据是干净的。 - 分组合并:遍历预处理后的数组,以
name作为分组的唯一标识,把所有相同name的accounts数组合并到一起,这样同一个账户分类下的所有子账户就都集中在一个数组里了。 - 去重处理:因为重复的子账户是通过
id(或code)来判断的,我们用子账户的id作为新数组的键——PHP中数组的键名是唯一的,重复的id会自动覆盖(如果两个重复id的内容一致,不影响结果;如果内容有差异,你可以根据需求选择保留第一个或最后一个)。最后用array_values把关联数组转回索引数组,和你期望的输出格式一致。 - 格式转换:把分组后的关联数组转换成索引数组,就得到了你想要的最终结果。
注意事项
- 如果你的重复判断依据不是
id而是code,只需要把代码中$uniqueAccounts[$account['id']]改成$uniqueAccounts[$account['code']]即可。 - 如果后续还有多个不同
name的项,这段代码也能自动分组合并,扩展性很好。
内容的提问来源于stack exchange,提问作者jaydon.T
相关产品推荐
相关产品推荐

