我有这个:
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_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'];
}
这要感谢"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_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
。