合并具有值总和的多维数组

时间:2016-03-12 00:39:27

标签: php arrays multidimensional-array

所以我有一个看起来像这样的多维数组:

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
    )

)

我想创建一个新数组,其中包含多维数组的每个数组中的所有键以及值的总和。

这是我的目标,TOTAL就是总和:

Array
(
    [GB] => TOTAL
    [US] => TOTAL
    [ES] => TOTAL
    [AU] => TOTAL
    [DE] => TOTAL
    [MY] => TOTAL
    [QA] => TOTAL
    [VN] => TOTAL
    [SK] => TOTAL
    [FJ] => TOTAL
    [ME] => TOTAL
    [TR] => TOTAL
    [LV] => TOTAL
    [IE] => TOTAL
    [PH] => TOTAL
    [MT] => TOTAL
    [HR] => TOTAL
    [ZA] => TOTAL
    [FR] => TOTAL
)

3 个答案:

答案 0 :(得分:1)

查看每个子数组,然后遍历键/值对。将它们添加到$final数组中:

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

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

答案 1 :(得分:0)

或许类似

$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);

答案 2 :(得分:0)

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

代码:(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