рекурсивная сумма массива php

У меня такой массив:

Array ( [1000] => Array ( [pv] => 36 ) [1101] => Array ( [1102] => Array ( [pv] => 92 ) [pv] => 38 ) [pv] => 64 ) 

Как я могу найти сумму всех элементов массива с ключом «pv», независимо от глубины, на которой они появляются.

Для этого примера результат будет 36+92+38+64 = 240

Спасибо за помощь.

Related of "рекурсивная сумма массива php"

Другая альтернатива:

 $sum = 0; $array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); foreach($array_obj as $key => $value) { if($key == 'pv') $sum += $value; } echo $sum; 

Обновление. Просто подумал, что я бы сказал, что этот метод использует Итераторы PHP SPL.


Salathe Редактировать:

Простой (относительно) способ фильтрации ключей и суммирования значений (без написания пользовательского Iterator) должен был бы сделать некоторую фильтрацию с помощью RegexIterator , преобразовать полученный итератор в массив и использовать на нем array_sum функцию array_sum . Это чисто академическое упражнение, и я, конечно, не стал бы защищать его как лучший способ достичь этого … однако, это всего лишь одна строка кода. 🙂

 $sum = array_sum( iterator_to_array( new RegexIterator( new RecursiveIteratorIterator( new RecursiveArrayIterator($array) ), '/^pv$/D', RegexIterator::MATCH, RegexIterator::USE_KEY ), false ) ); 
 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; } 

на основе ответа @Ali Sattari

 function sum($v, $w) { return $v + (is_array($w) ? array_reduce($w, __FUNCTION__) : $w); } 

вы можете использовать функции array_reduce или array_walk_recursive и собственную функцию обратного вызова самостоятельно:

 function sum($v, $w) { $v += $w; return $v; } $total = array_reduce($your_array, "sum"); 
 $sum = 0; function sumArray($item, $key, &$sum) { if ($key == 'pv') $sum += $item; } array_walk_recursive($array, 'sumArray',&$sum); echo $sum; 
 $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); 
 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'); 

Это даст вам больше возможностей для проверки альтернативных ключей набуханием.

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