对两个多维数组之间对应的元素求和


Sum corresponding elements between two multidimensional arrays

假设我有两个数组,我想添加相应的元素。

$v_4 = [
    [1, 2, 3], 
    [4, 5, 6],
];
$v_5 = [
    [7, 8, 9], 
    [10, 11, 12], 
];

我应该如何构造一个加法函数来对这些数组进行相加,从而得到:

[
    [8, 10, 12], 
    [14, 16, 18],
]

我知道我需要以某种方式利用array_map,但我不确定如何在这种多维情况下进行。

可以使用

$new = array();
foreach(array_map(null, $v_4, $v_5) as $var) {
    $data = call_user_func_array("array_map", array_merge(array(null) , $var));
    $new[] = array_map("array_sum", $data);
}
print_r($new);

参见Live DEMO

上面的例子仅限于2个数组。如果你有更多的10…您可以使用这个函数,只需稍加修改

print_r(array_sum_colums($v_4,$v_5,$v_6));

print_r(array_sum_colums(array($v_4,$v_5,$v_6)));

参见Live DEMO

函数
function array_sum_colums() {
    $args = count(func_get_args()) == 1 ? func_get_arg(0) : func_get_args();
    $arg = call_user_func_array("array_map", array_merge(array(null),$args));
    $new = array();
    foreach($arg as $var) {
        $data = call_user_func_array("array_map", array_merge(array(null), $var));
        $new[] = array_map("array_sum", $data);
    }
    return $new ;
}

从两个数组同步隔离各自的行,然后对行数据的每个分组有效负载中的列求和。

array_map()的外部调用从每个数组中隔离行,array_map()的内部调用从分组行中隔离列。

代码(演示)

var_export(
    array_map(
        fn(...$row) =>
            array_map(
                fn(...$col) => array_sum($col),
                ...$row
            ),
        $v_4,
        $v_5
    )
);

一种不那么动态,但性能更好的方法是使用嵌套循环并同步迭代两个数组中的每个元素,这种方法适合于您的确切示例数据,并且更容易阅读。当然,这只适用于两个数组具有完全相同的结构。

代码(演示):

$result = [];
foreach ($v_4 as $i => $row) {
    foreach ($row as $k => $v) {
        $result[$i][$k] = $v + $v_5[$i][$k];
    }
}
var_export($result);

实际上,如果您不介意在迭代时修改第一个数组,您可以简单地将第二个数组的相应值直接添加到第一个数组元素上。(演示)

foreach ($v_4 as $i => &$row) {
    foreach ($row as $k => &$v) {
        $v += $v_5[$i][$k];
    }
}
var_export($v_4);