1

我搜索了很多,但找不到确切的类似问题。PHP 中的内置函数不符合我的要求。注意: array_merge_recursively(...) 接近,但没有保留索引。

例如,我有 PHP 中的数组(json 可视化):

[
    ["1-6-13", 10],
    ["30-6-13", 13],
    ["20-9-13", 28]
]

和:

[
    ["18-2-13", 7],
    ["30-6-13", 9]
]

我想根据他们的日期合并这两个。然而,并非每个日期都与另一个日期匹配,重要的是数组 1 的值将位于索引 1 上,并且数组 2 的值必须附加到索引 2上。例如,不存在的值必须为 null。

所以想要的结果看起来像:

[
    ["18-2-13", null, 7],
    ["1-6-13", 10, null],
    ["30-6-13", 13, 9],
    ["20-9-13", 28, null]
]

我希望有人可以帮助我!

4

2 回答 2

3

您可以首先获取所有日期的集合,如下所示:

$dates = array_merge(array_map('reset', $data1), array_map('reset', $data2));

此集合包含重复项,但我们并不在意(array_unique如果这是一个问题,我们可以删除它们)。

旁注:如果运行 PHP >= 5.5,最好不要array_column($arr, 0)使用array_map('reset', $arr).

然后将其投影到一个数组数组中,使用日期作为键:

$result = array_fill_keys($dates, array(null, null, null));

并用数据填充它:

foreach($data1 as $pair) {
    list($date, $num) = $pair;
    $result[$date][0] = $date;
    $result[$date][1] = $num;
}

foreach($data2 as $pair) {
    list($date, $num) = $pair;
    $result[$date][0] = $date;
    $result[$date][2] = $num;
}

当然,上面可以很容易地推广到任意数量的带有循环的数组。

最后,如果您希望$result被数字索引,则丢失用作键的日期:

$result = array_values($result);

看到它在行动

于 2013-06-14T19:03:25.260 回答
1

你可以这样做。好处是您只需遍历数组一次:

$dates = array();
foreach( $array1 as $val ) {
    $dates[$val[0]] = array( $val[0], $val[1], null );
}
foreach( $array2 as $val) {
    $dates[$val[0]][0] = $val[0];
    $dates[$val[0]][1] = isset( $dates[$val[0]][1] ) ? $dates[$val[0]][1] : null;
    $dates[$val[0]][2] = $val[1];
}
于 2013-06-14T19:22:09.430 回答