简体   繁体   English

组合具有相同键的索引数组

[英]Combine Indexed arrays with the same keys

I am using the Flot jQuery plugin to create a graph on how many visitors there have been per platform.我正在使用 Flot jQuery 插件来创建一个关于每个平台有多少访问者的图表。 I would like to create a 4th line with total visitors, calculated by previously retrieved data.我想创建一个包含访问者总数的第 4 行,由以前检索的数据计算。

I need to combine several multi-dimensional Indexed arrays, but not simply merging them recursively.我需要组合几个多维索引数组,而不是简单地递归合并它们。 IE: IE:

$arr1 = [[2016/05/04,2],[2016/05/03,4],[2016/05/02,6]];
$arr2 = [[2016/05/04,1],[2016/05/03,3],[2016/05/02,2]];
$arr3 = [[2016/05/04,6],[2016/05/03,7],[2016/05/02,8]];

The output should be:输出应该是:

$arrTotal = [[2016/05/04,9],[2016/05/03,14],[2016/05/02,16]];

How do I accomplish this in a (fairly) simple way?我如何以(相当)简单的方式完成此操作?

First of all, you cannot declare your dates the way you did:首先,您不能像以前那样声明日期:

$arr1 = [[2016/05/04,2],[2016/05/03,4],[2016/05/02,6]];

Because it's going to take 2016, divide it by 5 then divide it by 4. You need to put them into quotes.因为要到 2016 年,所以先除以 5,然后再除以 4。你需要把它们放在引号中。

$arr1 = [['2016/05/04',2],['2016/05/03',4],['2016/05/02',6]];

But to create an associative array, you should do it this way:但是要创建关联数组,您应该这样做:

$arr1 = array('2016/05/04' => 2, '2016/05/03' => 4, '2016/05/02' => 6);
$arr2 = array('2016/05/04' => 1, '2016/05/03' => 3, '2016/05/02' => 2);
$arr3 = array('2016/05/04' => 6, '2016/05/03' => 7, '2016/05/02' => 8);

Now all you want to do, is loop through each array and sum them up.现在您要做的就是遍历每个数组并将它们相加。

$merge = array();

function mergeArray(Array &$merge, Array $array){
    // Loop through each key and value
    foreach($array as $key => $value)
        // Make sure the value is numeric
        if(is_numeric($value)){
            if(!isset($merge[$key]))
                $merge[$key] = $value;
            else
                $merge[$key] += $value;
        }
}

mergeArray($merge, $arr1);
mergeArray($merge, $arr2);
mergeArray($merge, $arr3);

And now if you dump the $merge :现在,如果您转储$merge

array(3) {
    ["2016/05/04"]=>
        int(9)
    ["2016/05/03"]=>
        int(14)
    ["2016/05/02"]=>
        int(16)
}

Build a method that will sum the values by respecting the keys of existing values.构建一个方法,通过尊重现有值的键来对值求和。

$arr1 = array('2016/05/04'=>2,'2016/05/03'=>4,'2016/05/02'=>6);
$arr2 = array('2016/05/04'=>1,'2016/05/03'=>3,'2016/05/02'=>2);
$arr3 = array('2016/05/04'=>2,'2016/05/03'=>7,'2016/05/02'=>8);

function array_sum(&$new_arr,$arr) {
    foreach ($arr as $date_key => $num_value) {
        // initialize date in new array with 0, if not done previously
        if (! isset($new_arr[$date_key])) { $new_arr[$date_key] = 0; }

        // add number for indexed element of array
        $new_arr[$date_key] += $num_value;
    }
}

$new_arr = array();
array_sum($new_array,$arr1);
array_sum($new_array,$arr2);
array_sum($new_array,$arr3);

You are trying to sum up every second value from each nested array relatively to their position in the parent array.您正在尝试对每个嵌套数组中相对于它们在父数组中的位置的每秒值求和。
There's a short and simple solution using array_map , array_sum and array_column functions:使用array_maparray_sumarray_column函数有一个简短而简单的解决方案:

$groupped = array_map(null, $arr1,$arr2,$arr3);
$result = array_map(function($v){    
    return [$v[0][0], array_sum(array_column($v, 1))];
}, $groupped);

print_r($result);

The output:输出:

Array
(
    [0] => Array
        (
            [0] => 2016/05/04
            [1] => 9
        )

    [1] => Array
        (
            [0] => 2016/05/03
            [1] => 14
        )

    [2] => Array
        (
            [0] => 2016/05/02
            [1] => 16
        )
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM