首页 > 解决方案 > 我有两个数组,带有 id 和总数。如果 ID 相同,我想添加总数。我该怎么办?

问题描述

我有 2 个数组。像这样的东西。

  $res1 = [
     ['ID' => 60,'TOTAL' => 500],
     ['ID' => 61,'TOTAL' => 600],
     ['ID' => 63,'TOTAL' => 500]
  ];
 $res2 = [
     ['ID' => 60,'TOTAL' => 600],
     ['ID' => 61,'TOTAL' => 700],
     ['ID' => 64,'TOTAL' => 800]
  ];

我想将 $res1 和 $res2 数组与 ID 合并,如果 ID 相等,则对总数求和,否则如果 ID 不匹配,那么我也应该将其保留在数组中。

这是我已经尝试过的,并且需要帮助以在性能方面进行更多改进。

 foreach ($res1 as $id1 => $val1) {
        foreach ($res2 as $id2 => $val2) {
            $r =array();
            if ($val1['ID'] == $val2['ID']) {
                $r['ID'] = $val1['ID'];
                $r['TOTAL'] = $val1['TOTAL'] + $val2['TOTAL'];
            }else{
                // MISSING Something here 
            }
            $result[] = $r;
        }

    }

预期结果应该是

$result = [
     ['ID' => 60,'TOTAL' => 1100],
     ['ID' => 61,'TOTAL' => 1300],
     ['ID' => 63,'TOTAL' => 500],
     ['ID' => 64,'TOTAL' => 800]
  ];

标签: php

解决方案


在我给出这个答案之前,如果这来自一个数据库表,那么最好只在该层中进行求和。也就是说,当数组增长时,它会变慢。

我要做的是首先获取所有ID。然后根据所有 ID 循环,然后搜索它们各自的总数和总和。像这样:

$result = [];
$ids = array_unique(array_merge(array_column($res1, 'ID'), array_column($res2, 'ID')));
foreach ($ids as $id) {
    if (empty($result[$id])) { // initialization
        $result[$id] = ['ID' => $id, 'TOTAL' => 0];
    }

    $res1_key = array_search($id, array_column($res1, 'ID'));
    $res2_key = array_search($id, array_column($res2, 'ID'));

    $sum = array_sum([
        $res1_key !== false ? $res1[$res1_key]['TOTAL'] : 0,
        $res2_key !== false ? $res2[$res2_key]['TOTAL'] : 0,
    ]);

    $result[$id]['TOTAL'] = $sum;
}

基本上获取第一个和第二个数组上存在的所有 id。根据IDS循环它,初始化容器,在两者上搜索ID总数,然后求和,然后将其分配到已初始化的容器中。

旁注:这仅考虑每个数组集的一个唯一 ID。如果两个数组中都有重复项,例如$res1has two ID = 60,则可以对其进行改造以array_keys获取多个搜索值,而不是array_search.


推荐阅读