对二维数组的一列中的值求和

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

我有这个:

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

我需要的是:

7
”,即
f_count
列的总和。

我花了几个小时试图解决这个问题。我认为

array_sum()
可以工作,但不适用于多维数组。所以,我尝试弄清楚如何通过
f_count
或拼接或其他任何方式来隔离
unset()
,但每个解决方案似乎都涉及
foreach
循环。我搞乱了
array_map
array_walk
和其他无济于事。我还没有找到适合多维数组的函数。

我正在运行 PHP 5.4。

有人可以告诉我如何在没有

foreach
循环的情况下对该列求和吗?

如果有帮助,

f_count
值永远不会高于
100
,并且
uid
值将始终大于
100


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

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

我正在使用 PDO。

php mysql arrays multidimensional-array sum
5个回答
120
投票

在 php 5.5+ 中,您可以像这样使用

array_column
array_sum

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

108
投票

您需要将其与

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'];
}

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


2
投票

对于这些类型的情况 foreach 循环是最好的选择,但如果您必须在单个页面上多次执行此操作,那么您应该将 foreach 循环放在函数中,以便您的代码保持干净

function sum_index($arr, $col_name){
    $sum = 0;
    foreach ($arr as $item) {
        $sum += $item[$col_name];
    }
    return $sum;
}

编辑

经过大量搜索后,我发现 php 5.5 + 中存在

array_column
函数,可以将单列的所有值作为数组获取。

对于较低版本的用户,如果您还想要所有值的总和,可以使用以下函数并用数组 sum 调用它。

//to get all values of single column from multidimensional array, this function exist in php 5.5 or greater.
if(!function_exists("array_column"))
{
    function array_column($array,$column_name)
    {
        return array_map(function($element) use($column_name){return $element[$column_name];}, $array);
    }
}

如果您想获取单列的所有值,请像这样调用上面的函数:

$newArray = array_column($array,$column_name);

如果您想要单列所有值的总和,请使用以下代码:

$newArraySum = array_sum(array_column($array,$column_name));

1
投票

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

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

我正在使用 PDO。

是的,还有另一种方式以不同的方式运行查询。您可以使用聚合函数

SUM
直接在查询中获取所有
f_count
的总和。您可以将其与
$stmt->fetchColumn()
结合起来,以获得第一行(这将是我们使用聚合函数后的唯一行)的第一列的值(这将是总和)。

以下是如何执行此操作的示例:

$query = "SELECT SUM(f_count) FROM users WHERE gid=:gid";
$stmt = $pdo->prepare($query);
$stmt->execute(array(':gid' => 'yoursearchvalue'));
$sum = $stmt->fetchColumn();

0
投票

由于您使用的是带 PDO 的 PHP 5.4,因此可能还有另一种方法可以实现此目的(在 PHP 5.1+ 中可用):

  • 使用 PDO
    fetchAll()
    函数,其中
    PDO::FETCH_COLUMN
    作为
    fetch_style
    ,0 索引列号作为
    fetch_argument

根据您的示例,可能是:

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

现在使用

array_sum
函数对数组的值求和:

$fcount_sum = array_sum($array_fcount);

您还可以查阅 PHP 文档: http://php.net/manual/en/pdostatement.fetchall.php

希望这有帮助,并且性能可能比循环更好!正如其他答案中已经提到的,在 PHP 5.5 中,您可以使用

array_column()
函数直接从另一个数组获取
$array_fcount

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