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



我有这个:

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()会起作用,但不是多维数组。所以,我试着弄清楚如何通过unset()或拼接或其他任何东西来隔离f_count s,但每种解决方案似乎都涉及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 5.5+中,您可以使用array_columnarray_sum:

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

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

这要感谢"locality"您正在使用的变量,即没有用于计算最终和的函数调用

对于这种情况,foreach循环是最好的选择,但如果你必须在一个页面上多次这样做,那么你应该把foreach循环放在一个函数中,这样你的代码就会保持干净

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

编辑

在搜索了很多之后,我发现array_column函数存在于php 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));

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

$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();

由于您使用的是带有PDO的PHP 5.4,因此可能有另一种方法可以做到这一点(在PHP 5.1+中可用):

  • 使用PDO fetchAll()函数,其中PDO::FETCH_COLUMNfetch_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

相关内容

  • 没有找到相关文章

最新更新