繁体   English   中英

PHP 数组总和值

[英]PHP array sum values

我有这个数组:

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

    )

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

    )
)

我希望它对两个不同数组的 [one] 和 [two] 求和并输出这样的数组:

Array
(
    [1111] => Array (
        [one] => 80
        [two] => 9.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] => 70
        [two] => 7.0
    )
)

有人可以告诉我我做错了什么吗?

您可以使用array_reduce将数组减少到只有一个元素。

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);

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

希望过渡合并输出能让你了解这个过程:

<?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);

输出:

array (
  'john' => 
  array (
    'hours' => 
    array (
      0 => 2,
      1 => 3,
    ),
    'tips' => 
    array (
      0 => 7,
      1 => 10,
    ),
  ),
  'james' => 
  array (
    'hours' => 8,
    'tips' => 0,
  ),
)
Result: 
array (
  'john' => 
  array (
    'hours' => 5,
    'tips' => 17,
  ),
  'james' => 
  array (
    'hours' => 8,
    'tips' => 0,
  ),
)
$total=0;
array_map(function ($item) use ($total)
{
    $total += $item['one'] + $item['two'];
}, $array);


echo $total;

或差异键



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

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

```

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM