按键对多维数组的值求和,不带循环

2022-08-30 11:23:25

我有这个:

Array (
    [0] => Array ( [f_count] => 1 [uid] => 105 ) 
    [1] => Array ( [f_count] => 0 [uid] => 106 ) 
    [2] => Array ( [f_count] => 2 [uid] => 107 ) 
    [3] => Array ( [f_count] => 0 [uid] => 108 ) 
    [4] => Array ( [f_count] => 1 [uid] => 109 ) 
    [5] => Array ( [f_count] => 0 [uid] => 110 ) 
    [6] => Array ( [f_count] => 3 [uid] => 111 )
)

我需要的是:“,这是列的总和。7f_count

我已经试图弄清楚这个问题几个小时了。我认为array_sum()可以工作,但不适用于多维数组。所以,我试图弄清楚如何通过或拼接或其他任何东西来隔离s,但每个解决方案似乎都涉及一个循环。我搞砸了 , 和其他东西,但无济于事。我还没有找到一个可以与多维数组很好地配合使用的函数。f_countunset()foreacharray_maparray_walk

我运行的是 PHP 5.4。

有人可以告诉我如何在没有循环的情况下对该列求和吗?foreach

如果有帮助,则值永远不会高于 ,并且值将始终大于 。f_count100uid100


或者,如果有一种方法可以以不同的方式运行我的查询,使得数组不是多维的,那么这显然也可以工作。

$query = "SELECT f_count, uid FROM users WHERE gid=:gid";
...
$array = $stmt->fetchAll();

我正在使用PDO。


答案 1

在 php 5.5+ 中,你可以这样使用:array_columnarray_sum

 $value = array_sum(array_column($arr,'f_count'));

答案 2

您需要将其与array_map()耦合才能首先选择该列:f_count

array_sum(array_map(function($item) { 
    return $item['f_count']; 
}, $arr));

现在你可以用array_column()替换内部函数:

array_sum(array_column($arr, 'f_count'));

当然,在内部,这执行双循环;只是你没有在代码中看到它。您可以使用 array_reduce() 来摆脱一个循环:

array_reduce($arr, function(&$res, $item) {
    return $res + $item['f_count'];
}, 0);

但是,如果速度是唯一的兴趣,则仍然是最快的:foreach

$sum = 0;
foreach ($arr as $item) {
    $sum += $item['f_count'];
}

这要归功于您正在使用的变量的“局部性”,即没有用于计算最终总和的函数调用。