使用相同的键组合索引数组

时间:2016-05-09 18:17:28

标签: php arrays flot

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

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

async

输出应为:

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

如何以(相当)简单的方式实现这一目标?

3 个答案:

答案 0 :(得分:1)

首先,你不能按照你的方式宣布你的日期:

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

答案 1 :(得分:0)

构建一个方法,通过尊重现有值的键来对值进行求和。

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

答案 2 :(得分:0)

您试图将每个嵌套数组中的每秒值相对于它们在父数组中的位置求和。
使用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
        )
)