42

我有这个:

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_counts ,但每个解决方案似乎都涉及一个循环。我已经弄乱了,和其他人无济于事。我还没有找到适用于多维数组的函数。unset()foreacharray_maparray_walk

我正在运行 PHP 5.4。

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

如果有帮助,f_count值将永远不会高于100,并且uid值将始终大于100


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

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

我正在使用 PDO。

4

5 回答 5

102

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

 $value = array_sum(array_column($arr,'f_count'));
于 2014-06-25T15:12:01.373 回答
89

您需要将其与array_map()首先选择f_count列:

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

当然,在内部,这执行了一个双循环;只是您在代码中看不到它。你可以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'];
}

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

于 2013-04-22T02:11:41.907 回答
2

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

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

编辑

经过大量搜索后,我发现array_columnphp 5.5 + 中存在该函数,可以将单列的所有值作为数组获取。

对于具有较低版本的用户,如果您还想要所有值的总和,您可以使用以下函数并使用数组 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));
于 2014-04-10T10:30:39.900 回答
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();
于 2018-05-16T19:17:31.620 回答
0

由于您将 PHP 5.4 与 PDO 一起使用,因此可能还有另一种方法(在 PHP 5.1+ 中可用):

  • 使用带有的PDOfetchAll()函数,使用 0 索引的列号作为.PDO::FETCH_COLUMNfetch_stylefetch_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);

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

希望这会有所帮助,并且性能可能比循环更好!正如其他答案中已经提到的,在 PHP 5.5 及以后的版本中,您array_column()可以$array_fcount直接从另一个数组中获取。

于 2017-03-29T04:51:59.390 回答