【问题标题】:PHP - How to get the sum of a multidimensional array? [duplicate]PHP - 如何获得多维数组的总和? [复制]
【发布时间】:2018-10-16 23:46:37
【问题描述】:

我试图得到这个数组的总和:

Array
(
[1] => 0
[2] => 1
[3] => Array
    (
        [0] => 1
        [1] => 1
        [2] => 1
    )

[4] => 1
[5] => 0
)

在这种情况下,总和应该是 5。我似乎无法让它工作。有人可以帮我吗?

编辑:

我尝试过使用 array_sum(这显然不起作用)和这样的递归数组:

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

不知何故,这会返回 20;

【问题讨论】:

  • 您将尝试过许多不同的选项,但都失败了。你为什么不和我们分享你的测试?我们很乐意帮助您修复代码
  • 能否发布完整代码?

标签: php arrays recursion multidimensional-array sum


【解决方案1】:

您可以将array_walk_recursive() 与通过引用使用外部变量结合使用:

$sum = 0;
array_walk_recursive($array, function($number) use (&$sum) {
    $sum += $number;
});
echo $sum;

如果数组的元素是数组本身,array_walk_recursive() 将遍历它。否则它将调用元素上的函数。

【讨论】:

    【解决方案2】:

    一种选择是使用array_walk_recursive

    $arr = $arr = array(0,1,array(1,1,1,),1,0,);
    $sum = 0;
    
    array_walk_recursive( $arr, function($i) use(&$sum){
        $sum += $i;
    });
    

    $sum 将导致5

    文档:array_walk_recursive()

    【讨论】:

    • 看起来像菲利普斯
    • 哦..我没有意识到这种方法已经得到了回答。
    【解决方案3】:

    递归派上用场了。

    您可以编写一个泛型方法,该方法处理任何深度级别的任何数组的求和。

    例子:

    $array = array(0, 1, 2, array(4, 5, array(7, 8)));
    
    function sumArr($arr) {
        $sum = 0;
        foreach($arr as $v) {
            if (is_array($v)) {
                $sum += sumArr($v);
            } else {
                $sum += $v;
            }
        }
        return $sum;
    }
    // prints 27 as intended
    echo sumArr($array);
    

    【讨论】:

    • PHP 为这个任务设计了一个特定的函数。请阅读其他答案。
    • 除非您的答案稍后发布。如果一个人想了解如何手动完成并深入了解递归概念,那没有错。显然作者为此苦苦挣扎。如果这样的函数的使用不影响整体性能,也不改变大O,那么如何计算多维数组的和只是个人喜好问题。
    • 好消息。我找到了一个完全相同的副本来关闭。这样简单的问题在 StackOverflow 上绝非独一无二。
    【解决方案4】:

    在您的尝试中无需添加 if 条件if($key == '3')

      $array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
      $sum = 0;
      foreach($array_obj as $key => $value) {
          $sum += $value;
      }
      echo "sum : ".$sum; 
    

    您正在获取平面数组,并且如果条件限制添加除3 之外的其他键值。你就快到了。

    Live Demo

    【讨论】:

      【解决方案5】:

      以下代码适用于任何维度数组:

      $input = array(0,1,array(1,1,1),1,0);
      
      function sum($arr){
        $sum=0;
        foreach($arr as $single){       
            if(is_array($single))
              $sum+= sum($single);
            else
              $sum+=$single;
          }
        return $sum;
      }
      
      echo sum($input);
      

      说明:上面的代码会执行如下:

      1. 遍历数组的每个元素
      2. 检查当前元素是另一个数组或简单数字。
      3. 如果当前元素是数组,则转到步骤 1。否则求和。

      将返回最终结果。

      【讨论】:

      • 请不要在 StackOverflow 中发布 Try this 答案。它们在 StackOverflow 上的价值很低,因为它们在教育 OP 和未来的读者方面做得很少。请改进这篇文章,解释它的工作原理以及研究人员应该使用它的原因。
      • 代码是不言自明的。当代码自己说话时,沉默会更好。无论如何,谢谢@mickmackusa
      • 对于熟悉 php/coding 的人来说,是的。但是各个层次的人来这里是为了知识。当人们了解某事为什么/如何运作时,沉默并不好。本网站是一个不断增长的知识资源,请多多关注本网站的内容。
      • 谢谢。我同意你的看法。下次我会记住的。
      • 非常感谢。请将此作为一种习惯 - 如果您这样做,您将帮助更多人并不可避免地获得更多积分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多