php 对三维数组中每行的深度值求和

t2a7ltrp  于 2023-01-04  发布在  PHP
关注(0)|答案(5)|浏览(133)

我需要计算每个一级元素的深层元素的总和。
3级阵列示例:

[
    1 => [
        'A' => ['AA' => 3, 'AB' => 5],
        'B' => ['BA' => 2]
    ],
    2 => [
        'C' => ['CA' => 4],
        'D' => ['DA' => 1, 'DB' => 2]
    ],
    3 => [
        'E' => ['EA' => 1, 'EB' => 2, 'EC' => 3],
        'F' => ['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的知识。

dzhpxtsq

dzhpxtsq1#

如果您想了解更多关于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
7rtdyuoh

7rtdyuoh2#

foreach的问题在于,数组有三层深,而foreach只遍历第一层,array_sum()只计算第二层。
你前面的一个例子:

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

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

foreach将迭代$total数组。以下是示例的迭代:

  1. $key = 0 ; $value = ['A'=>['AA'=>1,'AB'=>2], 'B'=>['BA'=>3,'BB'=>4]]
    在循环中,然后在$value上调用array_sum()array_sum()将所提供数组的子数组相加,如果它们是数值型的。不幸的是,$value是一个二维数组,其子数组是数组,所以它们不是数值型的。这就是为什么为它返回0
    问题的一个解决方案是使用array_walk_recursive()函数,该函数遍历内部数组并在其上调用函数,您可以指定:
$sum = 0;
array_walk_recursive($total, function($value) use (&$sum) {
    $sum += $value;
});

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

bqjvbblv

bqjvbblv3#

打印$total,当进入foreach时,$瓦尔是一个数组。所以当调用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);
?>

如果你的数组是三维的代码是这样的

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

icnyk63a4#

要获得所需的输出,首先应遍历数组并检查是否存在任何子数组,然后再次使用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);
r3i60tvu

r3i60tvu5#

对于函数样式的解决方案,使用array_map()迭代第一级的数据集。
然后压平剩余的水平,为array_sum()做准备。
array_values()目前是必需的,因为PHP还不允许解包非数字键数组。
array_merge(...$variable)用于使2D结构变平。
代码:(Demo

var_export(
    array_map(
        fn($set) => array_sum(array_merge(...array_values($set))),
        $array
    )
);

相关问题