array_merge与in_array无法满足需求,如何合并数组处理amount?
解决数组按ID累加/追加的问题
我懂你的痛点!想用array_merge和in_array实现按'id'合并数组、累加amount的逻辑确实行不通——这俩函数没法针对特定键值做精准的判断和数值累加操作。咱们换个思路,用以'id'为键的临时关联数组来处理,效率高还准确。
具体实现步骤
- 先把原数组
$array转换成以'id'为键的关联数组,这样后续查找id是否存在时,能直接通过键名快速定位,不用循环遍历整个数组。 - 遍历第二个数组
array2,对每个元素做判断:- 如果'id'已经在临时数组里,就把当前元素的'amount'累加到对应项的amount上;
- 如果'id'不存在,就把这个元素直接添加到临时数组中。
- 最后如果需要恢复成原来的索引数组格式,用
array_values()转换一下就行。
代码示例
假设你的输入数组是这样的:
$array = [ ['id' => 1, 'amount' => 10], ['id' => 2, 'amount' => 20] ]; $array2 = [ ['id' => 2, 'amount' => 15], ['id' => 3, 'amount' => 5] ];
处理代码:
// 构建以id为键的临时数组,方便快速查找 $tempArray = []; foreach ($array as $item) { $tempArray[$item['id']] = $item; } // 遍历第二个数组,处理合并/累加逻辑 foreach ($array2 as $item) { $currentId = $item['id']; if (isset($tempArray[$currentId])) { // id已存在,累加amount $tempArray[$currentId]['amount'] += $item['amount']; } else { // id不存在,直接追加 $tempArray[$currentId] = $item; } } // 转换回索引数组(如果不需要关联数组格式的话) $result = array_values($tempArray);
输出结果
执行后print_r($result)会得到:
Array ( [0] => Array ( [id] => 1 [amount] => 10 ) [1] => Array ( [id] => 2 [amount] => 35 ) [2] => Array ( [id] => 3 [amount] => 5 ) )
这个方法的优势在于,用键名判断存在性的时间复杂度是O(1),比用in_array循环查找的O(n)高效得多,尤其是数组元素较多的时候,差距会很明显。
内容的提问来源于stack exchange,提问作者Nathan Mayes
相关产品推荐
相关产品推荐

