如何对多维数组的列求和?

问题描述 投票:0回答:4

我有数组数据,例如:

[
    'A1' => [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    'A2' => [1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    'A3' => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
];

我想添加列值并生成一个平面总和数组。

我想要这样的答案:

[2, 1, 0, 0, 0, 0, 0, 0, 0, 0]

php中有没有数组函数可以做到这一点?不然我该怎么办?

php arrays multidimensional-array array-column array-sum
4个回答
2
投票

总是有自定义代码:

function array_sum_rows($arr) {
    $out = array();
    foreach ($arr as $row) {
        foreach ($row as $i => $val) {
            $out[$i] = isset($out[$i]) ? $out[$i] + $val : $val;
        }
    }
    return $out;
}

0
投票
$multiArray = ... //your array
$sumArray = array();
$i = 1;

foreach ($multiArray as $key => $array) {
    $sumArray[$i] = array_sum($array);
    $i++;
}

这适用于您的阵列。你会得到一个数组

http://php.net/manual/en/function.array-sum.php


0
投票

不幸的是在转置中丢失了实际索引:

function array_transpose($arr) {
    return call_user_func_array(
        'array_map',
        array_merge(
            array(NULL),
            $arr
        )
    );
}

$transposedArray = array_transpose($myData);
$result = array_map('array_sum', $transposedArray);
var_dump($result);

但是索引可以通过

恢复
$result = array_combine(array_keys(end($myData)), $result);

0
投票

“转置”输入数组(将数据旋转 90 度,使列变成行),然后将新的“行”输入到

array_map()
,以便每行都调用
array_sum()

代码:(演示

$array = [
    'A1' => [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    'A2' => [1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    'A3' => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
];

var_export(
    array_map(
        'array_sum', 
        array_map(
            null,
            ...array_values($array)
        )
    )
);

或者更少的函数调用/周期:(Demo)

var_export(
    array_map(
        fn(...$col) => array_sum($col),
         ...array_values($array)
    )
);

*在展开运算符 (

array_values()
) 之前需要调用
...
,直到使用不会因字符串键而阻塞的 php 版本。

产生平面输出阵列:

[2, 1, 0, 0, 0, 0, 0, 0, 0, 0]

© www.soinside.com 2019 - 2024. All rights reserved.