合并关联数组的索引数组并对重复键的值求和

Merge indexed array of associative arrays and sum the values of recurring keys

我有一个多维数组,如下所示:

Array
(
    [0] => Array
    (
        [GB] => 20827
        [US] => 73
        [ES] => 23
        [AU] => 15
        [DE] => 12
        [MY] => 4
        [QA] => 1
        [VN] => 1
        [SK] => 1
        [FJ] => 1
        [ME] => 1
        [TR] => 1
        [LV] => 1
    )

    [1] => Array
    (
        [GB] => 15070
        [US] => 3920
        [IE] => 1711
        [PH] => 1071
        [MT] => 578
        [AU] => 423
        [HR] => 241
        [ZA] => 210
        [FR] => 139
    )
)

我想用多维数组的每个数组中的所有关联元素创建一个新数组,并对重复键的值求和。

样本输入的期望结果:

array (
  'GB' => 35897,
  'US' => 3993,
  'ES' => 23,
  'AU' => 438,
  'DE' => 12,
  'MY' => 4,
  'QA' => 1,
  'VN' => 1,
  'SK' => 1,
  'FJ' => 1,
  'ME' => 1,
  'TR' => 1,
  'LV' => 1,
  'IE' => 1711,
  'PH' => 1071,
  'MT' => 578,
  'HR' => 241,
  'ZA' => 210,
  'FR' => 139,
)

可能是

$array = count($array1) > count($array2) ? $array1 : $array2;
$otherArray = count($array1) > count($array2) ? $array2 : $array1;

array_walk($array, function(&$value, $key, $otherArray) {
    $value = $value + (isset($otherArray[$key]) ? $otherArray[$key] : 0);
}, $otherArray);

遍历每个子数组,然后遍历 key/value 对。将它们添加到 $final 数组中:

$final = [];
foreach($masterArray as $subArray) {
    foreach($subArray AS $key => $value) {
        $final[$key] = isset($final[$key])
            ? $final[$key] + $value
            : $value;
    }
}

工作示例:https://3v4l.org/6XBbD

您可以通过将第一行数据“移出”输入数组并将关联元素直接推入输出数组来快速跟踪此任务。这消除了对第一行执行任何条件操作的需要,这将提高效率。

代码:(Demo)

$result = array_shift($array);
foreach ($array as $row) {
    foreach ($row as $key => $value) {
        $result[$key] = ($result[$key] ?? 0) + $value;
    }
}
var_export($result);

array_reduce() 的替代方案:(Demo)

$result = array_shift($array);
var_export(
    array_reduce(
        $array,
        function($result, $row) {
            foreach ($row as $key => $value) {
                $result[$key] = ($result[$key] ?? 0) + $value;
            }
            return $result;
        },
        $result
    )
);

替代 array_merge_recursive():(Demo)

$result = array_shift($array);
array_walk_recursive(
    $array,
    function($value, $key) use(&$result) {
        $result[$key] = ($result[$key] ?? 0) + $value;
    }
);
var_export($result);

作为使用 array_shift() 的副作用,如果输入数组为空,则以上所有片段的输出将是 null 而不是空数组。如果这对您的项目来说是一个破坏交易的因素,则将 array_shift() 替换为一个空数组 -- Demo.