PHP array - key为number时同一个key的求和值

PHP array - Sum value of the same key when key are number

我的情况与这个帖子类似:

Associative array, sum values of the same key

但是在我的例子中所有的键都是数字。 我想减少/合并键 0 相似的数组,并对所有其他键求和。

这是我的原始数组:

Array
(
[0] => Array
    (
        [0] => 093042
        [1] => 3
        [2] => 0
        [4] => 0
    )

[1] => Array
    (
        [0] => 222032
        [1] => 0
        [2] => 13
        [4] => 0
    )

[2] => Array
    (
        [0] => 222032
        [1] => 0
        [2] => 0
        [4] => 15
    )

[3] => Array
    (
        [0] => 152963
        [1] => 45
        [2] => 0
        [4] => 0
    )

[4] => Array
    (
        [0] => 222032
        [1] => 0
        [2] => 7
        [4] => 0
    )

)

这是我需要的输出:

Array
(
    [0] => Array
        (
            [0] => 093042
            [1] => 3
            [2] => 0
            [4] => 0
        )
    [1] => Array
        (
            [0] => 222032
            [1] => 0
            [2] => 20
            [4] => 15
        )
    [2] => Array
        (
            [0] => 152963
            [1] => 45
            [2] => 0
            [4] => 0
        )
)

其他线程的解决方案不起作用,因为它们使用了键名,我不知道如何根据我的情况进行调整。

请给我一个工作解决方案的例子。

回复:

现在我尝试类似的东西:从其他线程获取

$sum = array_reduce($data, function ($a, $b) {
        if (isset($a[$b[0]])) {
             $a[$b[0]]['budget'] += $b['budget'];
        }
        else {
             $a[$b[0]] = $b;
        }
        return $a;
    });

但是这个例子看起来只针对名为 budget 的键,但在我的例子中是数字,我有 3 个键 [1] [2] [3] 如何不能对键 1、2、4 求和,其中键 0 是相似

这应该适合你:

基本上我只是遍历你的数组并检查 $result 中是否已经有一个元素以 $v 的第一个元素为键。如果不是,我用一个 array_pad() 的 0 数组 + foreach 循环迭代的当前数组来初始化它。

然后我遍历 $v 的每个元素,期待第一个元素并将其添加到结果数组中。

最后我只是用 array_values().

重新索引结果数组
<?php

    foreach($arr as $v){

        if(!isset($result[$v[0]]))
            $result[$v[0]] = array_pad([$v[0]], count($v), 0);

        $count = count($v);
        for($i = 1; $i < $count; $i++)
            $result[$v[0]][$i] += $v[$i];


    }

    $result = array_values($result);
    print_r($result);

?>

输出:

Array
(
    [0] => Array
        (
            [0] => 093042
            [1] => 3
            [2] => 0
            [3] => 0
        )

    [1] => Array
        (
            [0] => 222032
            [1] => 0
            [2] => 20
            [3] => 15
        )

    [2] => Array
        (
            [0] => 152963
            [1] => 45
            [2] => 0
            [3] => 0
        )

)

试试这个

$data = Array
(
    0 => Array
        (
            0 => 93042,
            1 => 3,
            2 => 0,
            4 => 0,
        ),
    1 => Array
        (
            0 => 222032,
            1 => 0,
            2 => 13,
            4 => 0,
        ),
    2 => Array
        (
            0 => 222032,
            1 => 0,
            2 => 0,
            4 => 15,
        ),
    3 => Array
        (
            0 => 152963,
            1 => 45,
            2 => 0,
            4 => 0,
        ),
    4 => Array
        (
            0 => 222032,
            1 => 0,
            2 => 7,
            4 => 0,
        ),
);

var_dump($data);


// grouping

$tab1 = array();

foreach ($data as $e) {

    if (!isset($tab1[$e[0]])) {
        $tab1[$e[0]] = array();
    }

    $tab1[$e[0]][] = $e;
}

//var_dump($tab1);


// summing

$tabSum = array();

foreach ($tab1 as $id => $t) {

    foreach ($t as $e) {

        unset($e[0]);

        if (!isset($tabSum[$id])) {
            $tabSum[$id] = $e;
        } else {
            foreach ($e as $key => $value) {
                $tabSum[$id][$key] += $value;
            }
        }

    }

}

var_dump($tabSum);