不带循环的键的多维数组的和值

时间:2013-04-22 02:07:19

标签: php mysql arrays multidimensional-array

我有这个:

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() s,但每个解决方案似乎都涉及foreach循环。我与array_maparray_walk以及其他人混淆无济于事。我还没有找到一个适用于多维数组的函数。

我正在运行PHP 5.4。

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

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


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

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

我正在使用PDO。

5 个答案:

答案 0 :(得分:66)

在php 5.5+中,你可以使用array_columnarray_sum,如下所示:

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

答案 1 :(得分:58)

您需要将其与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'];
}

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

答案 2 :(得分:1)

对于这些类型的情况,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函数,将单列的所有值都作为数组。

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

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

答案 3 :(得分:1)

  

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

{{}}
     

我正在使用PDO。

是的,还有另一种以不同方式运行查询的方法。您可以使用聚合函数SUM直接在查询中获取所有{{" hello world"}} // is equal to <?php echo "hello world" ?> 的总和。你可以将它与$query = "SELECT f_count, uid FROM users WHERE gid=:gid"; ... $array = $stmt->fetchAll(); 结合起来得到第一行的第一列(这将是总和)的值(这是我们使用聚合函数以来的唯一一行)。

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

f_count

答案 4 :(得分:0)

由于您使用PHP 5.4和PDO,可能还有一种方法(在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);

您还可以参考http://php.net/manual/en/pdostatement.fetchall.php

上的PHP文档

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