php - 如何从3维数组中求和一个值

时间:2018-03-20 10:11:18

标签: php multidimensional-array

我的数据如下:

Array
(
    [1] => Array
        (
            [A] => Array
                (
                    [AA] => 3
                    [AB] => 5
                )

            [B] => Array
                (
                    [BA] => 2
                )

    [2] => Array
        (
            [C] => Array
                (
                    [CA] => 4
                )

            [D] => Array
                (
                    [DA] => 1
                    [DB] => 2
                )
        )

    [3] => Array
        (
            [E] => Array
                (
                    [EA] => 1
                    [EB] => 2
                    [EC] => 3
                )

            [F] => Array
                (
                    [FA] => 0
                    [FB] => 7
                    [FC] => 7
                )
)

我想总结价值,这是我的期望:

Array(
    [1] => 10        
    [2] => 7
    [3] => 20
)

这是我用来汇总值的代码:

$total[$country_id][$province_id][$city_id] = $amount;

$result = array();
foreach( $total as $key => $val ){
         $total[$key] = array_sum ( $val );
}

有人可以解释我的代码有什么问题或解释foreach是如何工作的吗?因为我的代码的结果是0,实际上我只研究了约1周的foreach。感谢

4 个答案:

答案 0 :(得分:3)

如果您想了解有关foreach的更多信息,请使用以下是一个更详细的解决方案:

$total = 0;
$totalByCountry = [];

// iterate over each country
foreach ($arr as $countryId => $provinces) {

    $totalByCountry[$countryId] = 0;

    // iterate over each province
    foreach ($provinces as $provinceId => $cities) {

        // iterate over each city
        foreach ($cities as $cityId => $value) {
            $totalByCountry[$countryId] += $value;
            $total += $value;
        }
    }
}

var_dump(totalByCountry)的结果:

array (size=3)
    1 => int 10
    2 => int 7
    3 => int 20

var_dump($total)的结果:

int 37

- 编辑 -

在现实世界的项目中,你最好不要那么冗长,并且使用为array_walk_recursive()这类情况制作的php函数,就像在Philipp MaurerFiroz Ahmad答案一样。

答案 1 :(得分:1)

foreach的问题在于,您的数组是三层深,而foreach仅遍历第一层而array_sum()仅计算第二层。

你的foreach的一个例子:

$total = [
    0 => [
        'A' => [
            'AA' => 1,
            'AB' => 2
        ],
        'B' => [
            'BA' => 3,
            'BB' => 4
        ]
    ]
];

foreach( $total as $key => $val ){
    $total[$key] = array_sum ( $val );
}

foreach将遍历$total数组。这是示例的iteraton:

  1. $key = 0; $value = ['A'=>['AA'=>1,'AB'=>2], 'B'=>['BA'=>3,'BB'=>4]]
    在循环中,您可以在array_sum()上致电$valuearray_sum()将所提供数组的子项添加到一起,如果它们是数字的话。遗憾的是$value是一个二维数组,它的子节点是数组,所以它们不是数字。这就是为什么返回0的原因。
  2. 问题的解决方案是使用array_walk_recursive()函数遍历内部数组并在其上调用函数,您可以指定:

    $sum = 0;
    array_walk_recursive($total, function($value) use (&$sum) {
        $sum += $value;
    });
    

    指定的函数将数组中每个叶子的值添加到指定的变量$sum,该变量通过引用函数给出。

答案 2 :(得分:0)

打印$ total,当来到foreach时,$ val是一个数组。因此,在调用array_sum函数时,它会对第一个数组求和,并将总数分配给新数组的第一个元素。这就是这个工作方式。您编码的原因不起作用,应该在foreach之外提供您已提供的foreach。从foreach的范围之上删除这个foreach。

<?php

$x=[0=>[1,2,3],1=>[2,3,4]];

$result = array();
foreach( $x as $key => $val ){
       $total[$key] = array_sum ( $val );
}
var_dump($total);
?>

如果您的数组是3维代码就是这样,

$y=[0=>[0=>[1,2,3],1=>[3,4,5]],1=>[0=>[5,6,7],1=>[8,9,10]]];

$result = array();
foreach( $y as $vals ){
   foreach( $vals as $key => $val ){
        $total[$key] = array_sum ( $val );
   }
}
var_dump($total);

答案 3 :(得分:0)

要实现所需的输出,首先应该遍历数组并检查是否存在任何子数组,然后再使用array_walk_recursive()函数遍历所有数组成员

<?php

    $arr = [
        [
            'A' => [
                'AA' => 3,
                'BB' => 5,
                'CC' => [
                    'DD' => 4,
                    'EE' => 5
                ]
            ],
            'B' => [
                'BA' => 2
            ]
        ],
        [
            'C' => [
                'CC' => 3,
                'CCC' => 2,
            ],
            'D' => [
                'DD' => 2
            ]
        ],

        5,
        [
            2,
            7
        ]

    ];

    $arrSum = [];

    $count = count($arr);

    for ($i = 0; $i < $count; $i++) {
        $sum = 0;
        if(is_array($arr[$i])) {
            array_walk_recursive($arr[$i], function ($item, $key) use (&$sum) {
                $sum += $item;
            });
        }
        else {
            $sum += $arr[$i];
        }

        $arrSum [] = $sum;
        $sum = 0;
    }

    var_dump($arrSum);