将具有相同键的索引数组组合在一起

Combine Indexed arrays with the same keys

我正在使用 Flot jQuery 插件创建一个关于每个平台有多少访问者的图表。我想创建第 4 行,其中包含根据之前检索到的数据计算的总访问者。

我需要合并多个多维索引数组,但不是简单地递归合并它们。即:

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

输出应该是:

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

如何以(相当)简单的方式完成此操作?

首先,您不能像以前那样声明日期:

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

因为要到2016年,先除以5再除以4,需要加引号。

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

但是要创建关联数组,您应该这样做:

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

现在您要做的就是遍历每个数组并将它们相加。

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

现在如果你转储 $merge:

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

构建一个方法,根据现有值的键对值求和。

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

您正在尝试对每个嵌套数组中相对于它们在父数组中的位置的每个第二个值求和。
使用 array_maparray_sum 有一个简短的解决方案和 array_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);

输出:

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