如何合并两个stdClass数组并对重复uuid的sum字段求和?
PHP合并两个stdClass数组并按UUID求和
实现思路
核心是利用UUID作为关联数组的键实现快速匹配,避免重复遍历查找,提升处理效率:
- 将第一个数组转换为以UUID为键的临时数组,便于后续快速判断UUID是否存在。
- 遍历第二个数组,对每个对象做两种处理:
- 若UUID已存在,累加两个对象的
sum值; - 若UUID不存在,直接将该对象添加到临时数组。
- 若UUID已存在,累加两个对象的
- 最后将关联数组转回索引数组,得到目标格式的结果。
完整代码示例
// 定义两个原始数组 $array1 = [ (object)['uuid' => '12e3b273-ef84-4960-9f81-16cc35e69a58', 'sum' => 10], (object)['uuid' => '345265aa-5f85-405d-b256-9f2cc706d222', 'sum' => 20], (object)['uuid' => '8650b97e-f7c0-4d4c-a065-a082bd4fdbce', 'sum' => 30], ]; $array2 = [ (object)['uuid' => '6be4da35-f0d0-4b24-99ed-ad06b95354ce', 'sum' => 200], (object)['uuid' => '8650b97e-f7c0-4d4c-a065-a082bd4fdbce', 'sum' => 100], ]; // 初始化合并后的临时数组 $merged = []; // 处理第一个数组,转为以UUID为键的数组 foreach ($array1 as $item) { $merged[$item->uuid] = clone $item; // 克隆对象避免修改原数组数据 } // 处理第二个数组,完成合并求和或新增 foreach ($array2 as $item) { if (isset($merged[$item->uuid])) { $merged[$item->uuid]->sum += $item->sum; } else { $merged[$item->uuid] = clone $item; } } // 将关联数组转换为连续索引数组 $result = array_values($merged); // 输出结果 print_r($result);
代码说明
- 使用
clone对象是为了防止修改原数组中的对象实例,避免产生意外的副作用。 - 以UUID为键的关联数组可以将存在性判断的时间复杂度从O(n)降到O(1),处理大数据量时效率优势明显。
array_values()会重置数组索引,最终生成连续的索引数组,完全符合你需要的输出格式。
内容的提问来源于stack exchange,提问作者Johannes
相关产品推荐
相关产品推荐

