不带循环的键的多维数组的和值

Dav*_*vid 29 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 ) 
    [4] => Array ( [f_count] => 1 [uid] => 109 ) 
    [5] => Array ( [f_count] => 0 [uid] => 110 ) 
    [6] => Array ( [f_count] => 3 [uid] => 111 )
)
Run Code Online (Sandbox Code Playgroud)

我需要的是: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();
Run Code Online (Sandbox Code Playgroud)

我正在使用PDO.

Ant*_*ley 75

在PHP 5.5+中你可以使用array_columnarray_sum喜欢这样:

 $value = array_sum(array_column($arr,'f_count'));
Run Code Online (Sandbox Code Playgroud)

  • "...多维数组......"深度是什么情况,例如"3"? (2认同)

Ja͢*_*͢ck 67

您需要将其与之array_map()匹配以f_count首先选择列:

array_sum(array_map(function($item) { 
    return $item['f_count']; 
}, $arr));
Run Code Online (Sandbox Code Playgroud)

当然,在内部,这会执行双循环; 只是你没有在代码中看到它.你可以array_reduce()用来摆脱一个循环:

array_reduce($arr, function(&$res, $item) {
    return $res + $item['f_count'];
}, 0);
Run Code Online (Sandbox Code Playgroud)

但是,如果速度是唯一的兴趣,foreach仍然是最快的:

$sum = 0;
foreach ($arr as $item) {
    $sum += $item['f_count'];
}
Run Code Online (Sandbox Code Playgroud)

这要归功于您正在使用的变量的"局部性",即没有用于计算最终总和的函数调用.

  • @David不,他们的效率都低于'foreach`. (4认同)
  • 我并没有太自以为是地认为这些选项可能比 foreach 更有效? (2认同)
  • 如果我能想出一个比我见过的更漂亮、更简单的 `foreach`,我会给你一个奖励。再次感谢。 (2认同)