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

时间:2015-07-14 19:47:23

标签: php arrays multidimensional-array associative-array

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

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

但是这个示例外观仅适用于键命名预算,但在我的情况下是数字,我有3个键[1] [2] [3]如何不能将键1,2,4和键0相似< / p>

2 个答案:

答案 0 :(得分:1)

这应该适合你:

基本上我只是遍历你的数组并检查#!/usr/bin/env perl use strict; use warnings; use File::Find; sub find_files { next unless m/\.m\z/; # skip any files that don't end in .m if ( $File::Find::dir =~ m/matlab_programs$/ ) { print $File::Find::name, " found\n"; } } find( \&find_files, "." ); 中是否已有一个元素$result的第一个元素的键。如果不是,我使用$v数组0&#39; s + foreach循环迭代的当前数组初始化它。

在此之后,我循环遍历array_pad()的每个元素,期望第一个元素并将其添加到结果数组中。

最后,我只使用$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);

?>

答案 1 :(得分: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);