【问题标题】:Sum values of each key on multidimensional array多维数组上每个键的总和值
【发布时间】:2015-07-31 18:07:33
【问题描述】:

我有一个干草堆,我想分别对每个数组的值求和。这就是我所拥有的:

Array //ALL THE HAYSTACK
(
    [0] => Array //REPRESENTS MONTH 1
        (
            [0] => Array  //REPRESENTS WEEK 1
                (
                    [week] => 1
                    [user1] => Array
                        (
                            [0] => Array
                                (
                                    [sell] => value
                                    [cost] => value
                                    [gain] => value
                                )
                        )

                    [user2] => Array
                        (
                            [0] => Array
                                (
                                    [sell] => value
                                    [cost] => value
                                    [gain] => value
                                )
                        )

                    [user3] => Array
                        (
                            [0] => Array
                                (
                                    [sell] => value
                                    [cost] => value
                                    [gain] => value
                                )
                        )
                )
            //... MORE WEEKS

        [1] => Array //REPRESENTS MONTH 2
        ( //... ALL THE PROCCES ABOVE
) 

我正在尝试每个月和每周都使用foreach(),如下所示:

$result = $array('sell' => 0, 'cost' => 0, 'gain' => 0);
foreach ($monthArray as $theMonth => $week){
    foreach ($week as $user){
        $result['sell'] +=  $user['user1'][0]['sell'];
        $result['sell'] +=  $user['user2'][0]['sell'];
        $result['sell'] +=  $user['user3'][0]['sell'];

        //...

但是,当我打印$result他每个月求和时,不是我想要的特定月份......

我想要每周和每月的总和。如何解决这个问题?

【问题讨论】:

    标签: php arrays multidimensional-array foreach sum


    【解决方案1】:

    这个怎么样?:结果 ($sales) 是一个数组。这个数组的键是月份,数组的值是总数。总数是通过迭代一个月中的几周,然后每周迭代用户来获得的。我介绍了自己的后一个迭代,因为您使用的是 user1、user2、user3 的硬编码列表......

    除了将它存储在另一个数组中之外,您还可以立即回显或使用它,但我认为将它放在数组中更便于进一步处理。它让你的代码有点解开。

    $result = $array('sell' => 0, 'cost' => 0, 'gain' => 0);
    foreach ($monthArray as $theMonth => $week){
        $sales[$theMonth] = 0;
        foreach ($week as $users){
            foreach ($users as $user) {
                $sales[$theMonth] +=  $user[0]['sell'];
            }
        }
    }
    
    result['sell'] = $sales;
    print_r(result['sell']);
    

    如果您也想获得每月的成本和收益,那么创建格式为$result[month]['sell'] 的数组可能比$result['sell'][month] 更有意义。

    【讨论】:

      【解决方案2】:

      您可以尝试使用array_reduce()array_column()。一个例子:这里:

      //$array = your array
      $sum_arr = array_reduce($array, function($old, $new){
          $arr = array_filter(array_map(function($v){ return is_array($v) ? $v : '';}, array_shift($new)));
          return [
              'sell' => array_sum(array_column($arr, 'sell')) + $old['sell'],
              'cost' => array_sum(array_column($arr, 'cost')) + $old['cost'],
              'gain' => array_sum(array_column($arr, 'gain')) + $old['gain'],
          ];
      }, ['sell'=>0, 'cost'=>0, 'gain'=>0]);
      

      更新:

      array_column()的替代品:

      $sum_arr = array_reduce($array, function($old, $new){
          $arr = array_filter(array_map(function($v){ return is_array($v) ? $v : '';}, array_shift($new)));
          return [
              'sell' => array_sum(array_map(function($v){return $v['sell'];}, $arr)) + $old['sell'],
              'cost' => array_sum(array_map(function($v){return $v['cost'];}, $arr)) + $old['cost'],
              'gain' => array_sum(array_map(function($v){return $v['gain'];}, $arr)) + $old['gain'],
          ];
      }, ['sell'=>0, 'cost'=>0, 'gain'=>0]);
      

      【讨论】:

      • 不需要使用循环。仅此代码足以满足您的$array
      • 但我的服务器 php 是 PHP 5.3... 不工作 array_columm() :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2014-04-02
      相关资源
      最近更新 更多