我有一个这样的数组:
Array
(
[1000] => Array
(
[pv] => 36
)
[1101] => Array
(
[1102] => Array
(
[pv] => 92
)
[pv] => 38
)
[pv] => 64
)
如何使用键'pv'找到所有数组元素的总和,无论它们出现的深度如何。
对于此示例,结果将为36+92+38+64 = 240
感谢您的帮助。
答案 0 :(得分:22)
另一种选择:
$sum = 0;
$array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($array_obj as $key => $value) {
if($key == 'pv')
$sum += $value;
}
echo $sum;
更新:我以为我会提到这个方法使用PHP SPL Iterators.
Salathe编辑:
过滤密钥并对值求和(不编写自定义迭代器)的简单(相对)方法是使用RegexIterator
进行一些过滤,将生成的迭代器转换为数组并使用方便array_sum
就可以了。这纯粹是一个学术练习,我当然不会提倡它作为实现这一目标的最佳方式......但是,它只是一行代码。 :)
$sum = array_sum(
iterator_to_array(
new RegexIterator(
new RecursiveIteratorIterator(
new RecursiveArrayIterator($array)
),
'/^pv$/D',
RegexIterator::MATCH,
RegexIterator::USE_KEY
),
false
)
);
答案 1 :(得分:10)
function addPV($array){
$sum = 0;
foreach($array as $key => $a){
if (is_array($a)){
$sum += addPV($a);
}else if($key == 'pv') {
$sum += $a;
}
}
return $sum;
}
答案 2 :(得分:6)
基于@Ali Sattari answer
function sum($v, $w) {
return $v + (is_array($w) ?
array_reduce($w, __FUNCTION__) : $w);
}
答案 3 :(得分:4)
您可以使用array_reduce
或array_walk_recursive
函数以及自己的自定义回调函数:
function sum($v, $w)
{
$v += $w;
return $v;
}
$total = array_reduce($your_array, "sum");
答案 4 :(得分:1)
$sum = 0;
function sumArray($item, $key, &$sum)
{
if ($key == 'pv')
$sum += $item;
}
array_walk_recursive($array, 'sumArray',&$sum);
echo $sum;
答案 5 :(得分:1)
$array = array('1000'=> array('pv'=>36), array('1101' => array('pv'=>92)));
$total = 0;
foreach(new recursiveIteratorIterator( new recursiveArrayIterator($array)) as $sub)
{
$total += (int) $sub;
}
print_r($total);
答案 6 :(得分:1)
function SumRecursiveByKey($array,$key)
{
$total = 0;
foreach($array as $_key => $value)
{
if(is_array($value))
{
$total += SumRecursiveByKey($array,$key);
}elseif($_key == $key)
{
$total += $value;
}
}
return $total;
}
使用
$summed_items = SumRecursiveByKey($myArray,'pv');
这会让你在检查膨胀的替代钥匙时有更多的余地。
答案 7 :(得分:-1)
private function calculateUserGv($userId) {
$group = $this->arrayUnder($this->_user_tree, $userId);
global $gv;
$gv = 0;
$gv = $this->gvRecursive($group);
return;
}
private function gvRecursive($group) {
global $gv;
foreach ($group as $key => $val) {
if ($key == 'pv') {
$gv += $group[$key];
}
else {
$this->gvRecursive($val);
}
}
return $gv;
}