我有这个:
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 5.5+ 中,您可以像这样使用
array_column
和 array_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'];
}
这要归功于您所使用的变量的“局部性”,即没有用于计算最终总和的函数调用。
对于这些类型的情况 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));
或者,如果有一种方法可以以不同的方式运行我的查询,这样 数组不是多维的,这显然也可以。
$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+ 中可用):
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
。