我有这个:
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_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。
答案 0 :(得分:66)
在php 5.5+中,你可以使用array_column
和array_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 +中可用):
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
。