2012-02-17 120 views
2

例如,我有$ dates1和$ dates2如下所示,并且想要创建$ dates3,它将所有日期保留在$ dates1中,并添加任何唯一日期在$ dates2,忽略任何重复。数组包含其他值,但我只是显示日期,因为这是我想合并/排序。如何合并两个日期数组忽略重复日期,然后按日期排序

$ dates1 =

Array 
(
[0] => Array 
    (
     [day] => 2012-01-01 
     [foo] => "bar" 
    ) 

[1] => Array 
    (
     [day] => 2012-01-02 
     [foo] => "bar" 
    ) 

[2] => Array 
    (
     [day] => 2012-01-03 
     [foo] => "bar" 
    ) 
) 

$ dates2 =

Array 
(
[0] => Array 
    (
     [day] => 2011-12-31 
    ) 

[1] => Array 
    (
     [day] => 2012-01-01 
    ) 

[2] => Array 
    (
     [day] => 2012-01-02 
    ) 
[3] => Array 
    (
     [day] => 2012-01-03 
    ) 
[4] => Array 
    (
     [day] => 2012-01-04 
    ) 
) 

所以我想合并$ dates2到$ dates1,忽略任何重复,使$ dates3:

Array 
(
[0] => Array 
    (
     [day] => 2011-12-31 
    ) 

[1] => Array 
    (
     [day] => 2012-01-01 
     [foo] => "bar" 
    ) 

[2] => Array 
    (
     [day] => 2012-01-02 
     [foo] => "bar" 
    ) 
[3] => Array 
    (
     [day] => 2012-01-03 
     [foo] => "bar" 
    ) 
[4] => Array 
    (
     [day] => 2012-01-04 
    ) 
) 
+1

提示...'array_multisort()'和'array_unique()'是你的朋友。 – Kenaniah 2012-02-17 20:22:34

回答

0

我不确定我是否正确理解你,你的意思是这样吗?

$old_array = array_merge($dates1, $dates2); 
    $new_array = array(); 
    foreach ($old_array as $item){ 
     if (!array_key_exists($item['day'], $new_array)){ 
      $new_array[$item['day']] = $item; 
     } 
    } 
    return $new_array; 
+0

嗯只是尝试后,试图普拉特的答案,我有同样的问题(最后一个元素似乎在foreach后失踪)..必须是问题是在我的最后..让我试试更多的东西.. – 2012-02-18 01:38:45

0

像这样的东西应该工作

$a1 = array(array('day' => '2012-01-01', 'foo' => 'bar1'), 
      array('day' => '2012-01-02', 'foo' => 'bar2'), 
      array('day' => '2012-01-03', 'foo' => 'bar3')); 

$a2 = array(array('day' => '2011-12-31'), 
      array('day' => '2012-01-01'), 
      array('day' => '2012-01-02'), 
      array('day' => '2012-01-03'), 
      array('day' => '2012-01-04')); 

$orderedArray = array(); 
foreach (array_merge($a1, $a2) as $v) 
{ 
    if (count($v) == 1 && isset($orderedArray[$v['day']])) 
     continue; 

    $orderedArray[$v['day']] = $v; 
} 
ksort($orderedArray); 

print_r($orderedArray); 

编辑:我重构代码。

+0

这几乎为我工作,除非它似乎是删除array_merge($ a1,$ a2)中的最后一个元素。 – 2012-02-18 01:31:11

+0

我的意思是在完成foreach后,如果我print_r($ orderedArray),最后一个元素(在你的例子中 - > array('day'=>'2012-01-04')),缺少,但我注意到这也发生在其他答案(zerg ling)中,所以可能是问题在我的末端。将尝试更多的东西.. – 2012-02-18 01:40:03

+0

你能告诉我你的array_merge($ a1,$ a2)的输出吗? – mpratt 2012-02-18 03:41:15