Php 无循环按键多维数组的和值

Php 无循环按键多维数组的和值,php,mysql,arrays,multidimensional-array,Php,Mysql,Arrays,Multidimensional Array,我有这个: 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 )

我有这个:

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
列的总和

我花了几个小时试图弄清楚这一点。我认为这是可行的,但不适用于多维数组。因此,我试图弄清楚如何通过
unset()隔离
f_计数
s
或拼接或任何其他方法,但每个解决方案似乎都涉及到一个
foreach
循环。我把
数组映射
数组行走
和其他方法都弄糟了,但都没有用。我还没有找到一个能与多维数组一起工作的函数

我正在运行PHP5.4

有人能告诉我如何在没有
foreach
循环的情况下对该列求和吗

如果有帮助,
f_count
值将永远不会高于
100
,而
uid
值将始终大于
100


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

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

我正在使用PDO。

您需要将其与相结合,以首先选择
f_count
列:

array_sum(array_map(function($item) { 
    return $item['f_count']; 
}, $arr));
当然,在内部,这执行一个双循环;只是在代码中看不到它。您可以使用它来摆脱一个循环:

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;
}
编辑

在搜索了很多之后,我发现PHP5.5+中存在
array\u 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));

在PHP5.5+中,您可以使用
array\u column
array\u sum
如下所示:

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

由于您将PHP5.4与PDO一起使用,因此还有另外一种方法(PHP5.1+中提供):

  • 使用PDO
    fetchAll()
    函数,将
    PDO::FETCH_列
    作为
    FETCH_样式
    ,将0索引列编号作为
    FETCH_参数
根据您的示例,可能是:

$query = "SELECT f_count, uid FROM users WHERE gid=:gid";
...
$array_fcount = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
现在使用
array\u sum
函数对数组的值求和:

$fcount_sum = array_sum($array_fcount);
您还可以在以下位置查阅PHP文档:

希望这会有所帮助,而且性能会比循环更好!如其他答案中所述,在PHP5.5以后的版本中,您可以使用
array\u column()
函数直接从另一个数组获取
$array\u fcount

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

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

是的,还有另一种不同的方式运行查询。您可以使用聚合函数直接在查询中获取所有
f_计数的总和。您可以将其与
$stmt->fetchColumn()
结合使用,以获取第一行(这将是自使用聚合函数以来唯一的一行)的第一列(即总和)的值

下面是一个如何做到这一点的示例:

$query = "SELECT SUM(f_count) FROM users WHERE gid=:gid";
$stmt = $pdo->prepare($query);
$stmt->execute(array(':gid' => 'yoursearchvalue'));
$sum = $stmt->fetchColumn();

我并不是太自以为是地认为这些选项可能比foreach更有效?@David不,它们的效率都不如
foreach
。我想我是被误导了。谢谢你的澄清。如果我能给你奖金的话,我会给你一个比我见过的其他人更漂亮、更简单的
foreach
。再次感谢。如果没有循环,你不能用数组做任何事情。你为什么这么讨厌它?谢谢你,伙计,现在我可以睡个好觉了。我的版本不是求和,而是计数,所以我使用这个函数=>
$value=array\u count\u value(array\u column($arr,'f\u count'))“…多维数组…”如果深度是,比如说,
3
?太棒了,谢谢你的朋友。