У меня такой массив:
Array ( [1000] => Array ( [pv] => 36 ) [1101] => Array ( [1102] => Array ( [pv] => 92 ) [pv] => 38 ) [pv] => 64 )
Как я могу найти сумму всех элементов массива с ключом «pv», независимо от глубины, на которой они появляются.
Для этого примера результат будет 36+92+38+64 = 240
Спасибо за помощь.
Другая альтернатива:
$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; }