PHP数组和值

PHP数组和值,php,arrays,Php,Arrays,我有一个数组: array( [1] => Array ( [1111] => Array ( [one] => 70 [two] => 7.0 ) ) [2] => Array ( [1111] => Array ( [one] =&

我有一个数组:

array(
[1] => Array
    (
        [1111] => Array
            (
                [one] => 70
                [two] => 7.0
            )

    )

[2] => Array
    (
        [1111] => Array
            (
                [one] => 10
                [two] => 2.0
            )

    )
)
我希望它对两个不同数组的[1]和[2]求和,并输出如下数组:

Array
(
    [1111] => Array (
        [one] => 80
        [two] => 9.0
    )
)
Array
(
    [1111] => Array (
        [one] => 70
        [two] => 7.0
    )
)
基于密钥1111

我试过以下几种方法

$array = array_values( $array );
$sum_array = [];

foreach ( $array as $k => $sub_array ) {
    foreach ( $sub_array as $id => $value ) {
        $sum_array[$id]            += array_key_exists( $id, $sum_array ) ? $sum_array[$id] += $value : $sum_array[$id] = $value;
        $sum_array[$id]['two'] += array_sum( $sum_array[$id]['two'] ) / ( 100 * count( $sum_array[$id]['count'] ) );
    }
}
但这只给了我这样的第一个值:

Array
(
    [1111] => Array (
        [one] => 80
        [two] => 9.0
    )
)
Array
(
    [1111] => Array (
        [one] => 70
        [two] => 7.0
    )
)
谁能告诉我我做错了什么吗?

您可以使用将数组缩减为一个元素

array_reduce函数采用两个或三个参数。第一个是数组,第二个是回调,包含两个参数:收集器和当前项。如果array_reduce函数有第三个参数,它将用于初始化收集器,就像我们的例子一样

函数将解析每个项并对其进行处理,收集器将在每次迭代时可用,这就是为什么我们使用它来保存数据信息,在我们的例子中,它是值的总和。迭代完所有项后,函数返回收集器

<?php
$array = [
            [
                '1111' => [
                    'one' => 70,
                    'two' => 7.0
                ]
            ],
            [
                '1111' => [
                    'one' => 10,
                    'two' => 2.0
                ]
            ]
    ];

    $output = array_reduce($array, function($collector, $item) {
        $collector['1111']['one'] += $item['1111']['one'];
        $collector['1111']['two'] += $item['1111']['two'];
        return $collector;
    }, ['1111' => ['one' => 0, 'two' => 0]]);

    var_dump($output);
或差分键



$one = array_sum(array_column($array, 'one'));
$two = array_sum(array_column($array, 'two'));

$resultArray = compact('one','two');

```

下面是一种使用递归合并的方法。在下面的合并中,John的小时数成为一个数组。然后我们需要求和。由于詹姆斯只有一个条目,他的时间不会变成数组,所以我们将其保留

希望过渡合并输出能让您了解该过程:

<?php

$items = 
[
    [
        'john' => [
            'hours' => 2,
            'tips' => 7
        ]
    ],
    [
        'john' => [
            'hours' => 3,
            'tips' => 10
        ]
    ],
    [
        'james' => [
            'hours' => 8,
            'tips' => 0
        ]
    ]
];

$output = array_merge_recursive(...$items);
var_export($output);

array_walk($output, function(&$v) {
    array_walk($v, function(&$v) {
        if(is_array($v))
            $v = array_sum($v);
    });
});
echo "\nResult: \n";
var_export($output);

由于这些数组的嵌套,此代码将导致$total、$one和$two为0。另外,数组映射中的$total需要一个引用。在array_map示例中,似乎您正在尝试合计所有值。