php数组递归总和

Ale*_*tau 4 php arrays recursion

我有这样一个数组:

Array
(
    [1000] => Array
        (
            [pv] => 36
        )

    [1101] => Array
        (
            [1102] => Array
                (
                    [pv] => 92
                )

            [pv] => 38
        )

    [pv] => 64
)
Run Code Online (Sandbox Code Playgroud)

如何使用键'pv'找到所有数组元素的总和,无论它们出现的深度如何.

对于这个例子,结果将是 36+92+38+64 = 240

感谢帮助.

Rus*_*ias 22

另一种选择:

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

更新:我以为我会提到这个方法使用PHP SPL迭代器.


Salathe编辑:

过滤键并对值求和(不编写自定义迭代器)的简单(相对)方法是使用a进行一些过滤RegexIterator,将生成的迭代器转换为数组并array_sum在其上使用方便的函数.这纯粹是一个学术练习,我当然不会提倡它是实现这一目标的最佳方式......但是,它只是一行代码.:)

$sum = array_sum(
    iterator_to_array(
        new RegexIterator(
            new RecursiveIteratorIterator(
                new RecursiveArrayIterator($array)
            ),
            '/^pv$/D',
            RegexIterator::MATCH,
            RegexIterator::USE_KEY
        ),
        false
    )
);
Run Code Online (Sandbox Code Playgroud)

  • @ ircmaxell,@ erisco Cue荒谬的单行...`$ sum = array_sum(iterator_to_array(new RegexIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($ array)),'/ ^ pv $/D',RegexIterator :: MATCH,RegexIterator :: USE_KEY),false));` (2认同)

fre*_*ley 11

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;
}
Run Code Online (Sandbox Code Playgroud)

  • @elusive:在PHP5.3中你可以传递匿名函数(比如javascript倾向于这样做),也许这对你来说不那么令人毛骨悚然:`$ arr = range(1,40); var_dump(array_reduce($ arr,function($ v,$ k){return $ v + $ k;}));` (3认同)

use*_*291 6

基于@Ali Sattari 回答

function sum($v, $w) {
    return $v + (is_array($w) ? 
        array_reduce($w, __FUNCTION__) : $w);
}
Run Code Online (Sandbox Code Playgroud)