无循环键的多维数组的总和

2021/01/15 01:21 · php ·  · 0评论

我有这个:

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值将永远不会大于100,并且uid值将始终大于100


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

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

我正在使用PDO。

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

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

在PHP 5.5+你可以使用array_columnarray_sum像这样:

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

对于这种情况,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 +中,以获取单列的所有值作为数组。

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

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

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

  • 使用PDOfetchAll()函数,将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

本文地址:http://php.askforanswer.com/wuxunhuanjiandeduoweishuzudezonghe.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!