Php 相同格式的多维数组之和

Php 相同格式的多维数组之和,php,arrays,laravel,multidimensional-array,sum,Php,Arrays,Laravel,Multidimensional Array,Sum,我有一个多维数组,格式如下: array ( 0 => array ( 'manual' => 1, 'cancelled' => 1, 'expired' => 1, 'earned' => 1, 'user' => array ( 'user1' => 1, 'user2' => 1, 'user3' => 1, 'user4' =

我有一个多维数组,格式如下:

array (
  0 => 
  array (
    'manual' => 1,
    'cancelled' => 1,
    'expired' => 1,
    'earned' => 1,
    'user' => 
    array (
      'user1' => 1,
      'user2' => 1,
      'user3' => 1,
      'user4' => 1,
    ),
    'transfer' => 
    array (
      'transfer1' => 
      array (
        'key1' => 1,
        'key2' => 1,
        'key3' => 1,
      ),
      'transfer2' => 
      array (
        'key5' => 1,
        'key6' => 1,
        'key7' => 1,
      ),
    ),
    'date' => '2018-03-07',
  ),
  1 => 
  array (
    'manual' => 1,
    'cancelled' => 1,
    'expired' => 1,
    'earned' => 1,
    'user' => 
    array (
      'user1' => 1,
      'user2' => 1,
      'user3' => 1,
      'user4' => 1,
    ),
    'transfer' => 
    array (
      'transfer1' => 
      array (
        'key1' => 1,
        'key2' => 1,
        'key3' => 1,
      ),
      'transfer2' => 
      array (
        'key5' => 1,
        'key6' => 1,
        'key7' => 1,
      ),
    ),
    'date' => '2018-03-08',
  ),
)我需要计算具有相同索引的数组值之和。因此,总数组应如下所示

Array
(
    [total] => Array
        (
            [manual] => 2
            [cancelled] => 2
            [expired] => 2
            [earned] => 2
            [user] => Array
                (
                    [user1] => 2
                    [user2] => 2
                    [user3] => 2
                    [user4] => 2
                )

            [transfer] => Array
                (
                    [transfer1] => Array
                        (
                            [key1] => 2
                            [key2] => 2
                            [key3] => 2
                        )

                    [transfer2] => Array
                        (
                            [key5] => 2
                            [key6] => 2
                            [key7] => 2
                        )
        )
也就是说,除了日期之外,合计应该具有相同的格式,但它需要显示值的总和。如何在PHP中实现这一点?我使用了以下代码

$final = array_shift($input);
foreach ($final as $key => &$value){
  $value += array_sum(array_column($input, $key));
}

unset($value);

var_dump($final);

其中,
$input
被视为第一个数组,
$final
是总计。我认为这只适用于单个索引

可以使用递归函数遍历所有“树”

那里

若元素为数组,则在结果数组中创建相同的元素,并为每个键运行函数。 若它有一个数字,只需在结果中添加值即可

这是一个样本

<?php
// Array with data
$arr=array(array('manual'=>1,'cancelled'=>1,'expired'=>1,'earned'=>1,'user'=>array('user1'=>1,'user2'=>1,'user3'=>1,'user4'=>1,),'transfer'=>array('transfer1'=>array('key1'=>1,'key2'=>1,'key3'=>1,),'transfer2'=>array('key5'=>1,'key6'=>1,'key7'=>1,)),'date'=>'2018-03-07',),array('manual'=>1,'cancelled'=>1,'expired'=>1,'earned'=>1,'user'=>array('user1'=>1,'user2'=>1,'user3'=>1,'user4'=>1,),'transfer'=>array('transfer1'=>array('key1'=>2,'key2'=>2,'key3'=>2,),'transfer2'=>array('key5'=>2,'key6'=>2,'key7'=>2,)),'date'=>'2018-03-08',)); 

//Init result array
$res=array('total'=>array());

foreach ($arr as $key=>$val) {
    //Run it for each element and store result to $res['total']
   countTotal($res['total'],$val);
}

//Show result
print_r($res);


/*
* Count totals for branch of array
* @param $res - reference to branch of result array
* @param $arr - branch of data array
*/
function countTotal(&$res,$arr) {
        foreach ($arr as $key=>$val) {
            if (is_array($val)) {
                //it's array. Create "branch" in $res and run countTotal() to calc total for it
                if (!isset($res[$key])) $res[$key]=array();
                countTotal($res[$key],$val);
            } else if (is_numeric($val)) {
                // it's number. Create "leaf" if need and add value.
                if (!isset($res[$key])) $res[$key]=0;
                $res[$key]+=$val;
            }
        }
}

在第二个“transfer”中,我使用了“2”,所以它的总和是“3”

您可以编写如下递归函数:

function array_sum_recursive_assoc($array, &$result = [])
{
    $keys = array_keys($array[0] ?? []);

    foreach ($keys as $key) {
        foreach (($column = array_column($array, $key)) as $value) {
            if (is_array($value)) {
                $result[$key] = [];
                array_sum_recursive_assoc($column, $result[$key]);
                continue 2;
            }

            // In this case date safe guard.
            if (!is_numeric($value)) {
                continue;
            }

            $result[$key] = ($result[$key] ?? 0) + $value;
        }
    }

    return $result;
}

var_dump(array_sum_recursive_assoc($array));

这是。

相同的索引。
->您用来比较的索引是什么?@AlivetoDie第0个元素中的索引
手动
需要添加到第一个元素中的
手动
。因此,
手动
索引的总值为2。这对所有其他索引都是一样的。所以根据手册,您将检查是否需要添加子数组?我说的对吗?你可以在这里找到解决办法不。这就像
$total['total']['manual']=$array[0]['manual']+$array[1]['manual']
$total['total']['cancelled']=$array[0]['cancelled']+$array[1]['cancelled']
$total['total']['user'['user1']=$array[0]['user']['user1']+$array[1]//code>
function array_sum_recursive_assoc($array, &$result = [])
{
    $keys = array_keys($array[0] ?? []);

    foreach ($keys as $key) {
        foreach (($column = array_column($array, $key)) as $value) {
            if (is_array($value)) {
                $result[$key] = [];
                array_sum_recursive_assoc($column, $result[$key]);
                continue 2;
            }

            // In this case date safe guard.
            if (!is_numeric($value)) {
                continue;
            }

            $result[$key] = ($result[$key] ?? 0) + $value;
        }
    }

    return $result;
}

var_dump(array_sum_recursive_assoc($array));