PHP数组-当键为数字时,相同键的总和值


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

我的情况与此线程相似:

关联数组,对相同键

的值求和

然而,在我的情况下,所有的键都是数字。我想减少/组合数组,其中键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;
    });

但这个例子只针对名为预算的键但在我的情况下是数字,我有3个键[1][2][3]键如何不能求和键1,键2,键4,键0相似

这应该可以为您工作:

基本上,我只是循环遍历数组并检查$result中是否已经有一个元素具有$v的第一个元素的键。如果不是,我用一个由0组成的array_pad()数组+ 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
        )
)

try this

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