合并和求和多维关联数组PHP

yyhrrdl8  于 2023-06-28  发布在  PHP
关注(0)|答案(1)|浏览(94)

我有一个数组

$data = array(
        1 => array(1 => 11 ,2 => 21, 3 => 31),
        2 => array(1 => 21 ,2 => 22),
        3 => array(1 => 31 ,2 => 23, 3 => 32),
    );

我想把它转换成

$data = array(
        1 => array(1 => 11 ,2 => 21, 3 => 31, 'Total' => 63),
        2 => array(1 => 21 ,2 => 22, 'Total' => 43),
        3 => array(1 => 31 ,2 => 23, 3 => 32, 'Total' => 83),
        'Total' => array(1 => 63,2 => 46,3 => 63, 'Total' => 172),
    );

键1、2、3是动态的,它们可以是1到10,并且也用于子阵列。你能帮忙吗?

gcuhipw9

gcuhipw91#

我在Stack Overflow中找到的大多数答案都与数组中的元素求和或多维数组中不同键的求和有关,但我找不到任何在同一代码中解决这两个问题的答案,所以我想分享一下可能会有用。

驻地

你想要的结果似乎不正确,通过手动计算,总数应该与你描述的不同。所以我假设你的例子是错误的,这是你想要的实际结果:

$data = array(
    1 => array(1 => 11 ,2 => 21, 3 => 31, 'Total' => 63),
    2 => array(1 => 21 ,2 => 22, 'Total' => 43),
    3 => array(1 => 31 ,2 => 23, 3 => 32, 'Total' => 86),
    'Total' => array(1 => 63,2 => 66,3 => 63, 'Total' => 192),
);

循环和求和数组

所以你基本上想要两件事:
1.对于数组的每个第一级元素,您需要计算Total。这是通过array_sum完成的,您可以通过在$data数组的第一级执行foreach来应用它。More info on array_sumthe official php documentation
1.然后,对于每个第二级元素,您希望对具有相同key的元素求和。为此,可以使用一个简单的foreach,它跟踪第二级键并对每个值求和

结果代码

生成的代码将这两点与以下逻辑结合在一起:
1.在$data数组的第一级中初始化Totals
1.循环第一级元素
1.对于每个第一级元素,使用array_sum获取Total
1.循环第二级元素
1.对于第二级的每个索引(1、2、3),在Totals数组中初始化相同的索引
1.对于第二级的每个索引(1,2,3),对Totals数组中的计数器(11,21,31)求和
我添加了注解以使其更清晰:

// Initialize the 'Total' key in the first-level of the array. This will be populated in the foreach
$data['Total'] = [];
// Loop the first level of the array
foreach ($data as $key => $values) {
    // Calculate the sum of the first level of the array, using array_sum
    $data[$key]['Total'] = array_sum($data[$key]);
    // Loop the second level of the array
    foreach ($values as $index => $count) {
        // For each INDEX, create the corresponding element of the Totals array
        if (!isset($data['Total'][$index])) {
            $data['Total'][$index] = 0;
        }
        // Sum this element $count in the Total array
        $data['Total'][$index] += $count;
    }
}

相关问题