2014-09-27 107 views
0

所以,我有两个数组中的一些日期:比较日期值之间的两个阵列

$old_1 = array(
    array(
       'start_date' => '2014-09-06', 
       'end_date' => ' 2014-09-07' 
      ), 
      array(
       'start_date' => '2014-09-26', 
       'end_date' => '2014-09-28' 
      ), 
      array(
       'start_date' => '2014-09-29', 
       'end_date' => '2014-10-02' 
      ), 
      array(
       'start_date' => '2014-10-03', 
       'end_date' => ' 2014-10-04' 
      ), 
      array(
       'start_date' => '2014-10-06', 
       'end_date' => ' 2014-10-23' 
      ), 
     array(
       'start_date' => '2014-11-19', 
       'end_date' => '2014-11-23' 
      ), 
      array(
       'start_date' => '2014-11-25', 
       'end_date' => ' 2014-11-28' 
      ) 
); 

$new_1 = array(
    array(
       'start_date' => '2014-10-03', 
       'end_date' => ' 2014-10-04' 
      ), 
      array(
       'start_date' => '2014-10-10', 
       'end_date' => ' 2014-10-12' 
      ), 
      array(
       'start_date' => '2014-10-17', 
       'end_date' => '2014-10-19' 
      ), 
      array(
       'start_date' => '2014-11-19', 
       'end_date' => ' 2014-11-23' 
      ), 
      array(
       'start_date' => '2014-11-25', 
       'end_date' => '2014-11-28' 
      ) 
); 

我比较数组$ old_1和数组$ new_1,寻找日期是不是在数组$ old_1。如我所期待的结果:

$expected_1 = array(
    array(
      array(
       'start_date' => '2014-10-10', 
       'end_date' => ' 2014-10-12' 
      ), 
      array(
       'start_date' => '2014-10-17', 
       'end_date' => '2014-10-19' 
      ) 
); 

我用这个功能来做到这一点:

function checkDate($redDate, $date_range) 
    { 
     $start_object = DateTime::createFromFormat('Y-m-d', $redDate['start_date']); 
     $end_object = DateTime::createFromFormat('Y-m-d', $redDate['end_date']); 

     if (is_array($date_range)) { 
      foreach ($date_range as $key => $row) { 
       $range_start = DateTime::createFromFormat('Y-m-d', $row['start_date']); 
       $range_end = DateTime::createFromFormat('Y-m-d', $row['end_date']); 

       if ($start_object != $range_start && $end_object != $range_end) { 
        if ($start_object < $range_end && $end_object > $range_start) { 
         $date = $redDate; 
        } 
       } 
      } 
     } 

     return $date; 
    } 

$expected = array(); 
foreach ($new_1 as $dates) { 
$value = checkDate($dates, $old_1); 
if (!empty($value)) { 
$expected[] = $value; 
} 
} 

但是这功能不符合这两个数组工作:

$old_2 = array(
    array(
       'start_date' => '2014-09-26', 
       'end_date' => '2014-09-28' 
      ), 
      array(
       'start_date' => '2014-10-03', 
       'end_date' => ' 2014-10-04' 
      ) 
); 
$new_2 = array(
    array(
       'start_date' => '2014-09-26', 
       'end_date' => '2014-09-28' 
      ), 
      array(
       'start_date' => '2014-10-03', 
       'end_date' => ' 2014-10-04' 
      ), 
      array(
       'start_date' => '2014-10-17', 
       'end_date' => '2014-10-20' 
      ), 
      array(
       'start_date' => '2014-10-29', 
       'end_date' => ' 2015-01-02' 
      ) 
); 

我期待:

$expected_2 = array(
     array(
       array(
        'start_date' => '2014-10-17', 
        'end_date' => '2014-10-20' 
       ), 
       array(
        'start_date' => '2014-10-29', 
        'end_date' => ' 2015-01-02' 
       ) 
    ); 

但我去t空阵列:

$result_2 = array(
    ); 

我在比较函数中会错过什么吗? 我需要您的意见,大家好,谢谢:)

回答

0

试试这个checkDate功能:

function checkDate($redDate, $date_range) 
    { 
     $start_object = DateTime::createFromFormat('Y-m-d', $redDate['start_date']); 
     $end_object = DateTime::createFromFormat('Y-m-d', $redDate['end_date']); 

     if (is_array($date_range)) { 
      foreach ($date_range as $key => $row) { 
       $range_start = DateTime::createFromFormat('Y-m-d', $row['start_date']); 
       $range_end = DateTime::createFromFormat('Y-m-d', $row['end_date']); 

       // if the date was found return a null object 
       if ($start_object == $range_start && $end_object == $range_end) { 
        return null; 
       } 
      } 
     } 

     // the date was not found so return the date 
     return $redDate; 
    } 
+0

我稍后再试, – 2014-09-28 06:32:30

+0

你好, 是的,它的工作,现在我得到了我期望的结果。 有新的问题,在数组$ new_1,我得到: '阵列( '开始日期'=> '2014年10月', 'END_DATE'=> '2014年10月12日' ), 阵列( '起始日期'=> '2014年10月17日', 'END_DATE'=> '2014年10月19日' )' ,其与$ old_1阵列的旧值的重叠: '阵列( “起始日期'=>'2014-10-06', 'end_date'=>'2014-10-23' ),' 如何消除与旧数据冲突时的新数组值? – 2014-09-29 14:33:35

+0

所以$ expected_1的正确值是一个空数组(),因为10-12和10-17因重叠而被删除。 谢谢 – 2014-09-29 14:34:02

0

有一些在你的例子日期的空间。这是你应该纠正的错误。

在这里,你有内心的痕迹如果。

2014-09-26 < 2014-10-04 TRUE && 2014-09-28 > 2014-10-03 FALSE 
2014-10-03 < 2014-09-28 FALSE && 2014-10-04 > 2014-09-26 TRUE 
2014-10-17 < 2014-09-28 FALSE && 2014-10-20 > 2014-09-26 TRUE 
2014-10-17 < 2014-10-04 FALSE && 2014-10-20 > 2014-10-03 TRUE 
2014-10-29 < 2014-09-28 FALSE && 2015-01-02 > 2014-09-26 TRUE 
2014-10-29 < 2014-10-04 FALSE && 2015-01-02 > 2014-10-03 TRUE 
array(0) { } 

无论如何,我不知道你在找什么。你想达到什么目的?

+0

我正在寻找不在$ old_1数组中的$ new_1数组中的日期范围(start_date - end_date)。 抱歉,我只是不提及,$ old_1数组是从数据库/表中提取的,$ new_1数组是从服务中提取的。我想将不在数据库/表中的新提取的数据插入到其中。 – 2014-09-28 06:14:14

+0

friedi的解决方案应该可以正常工作。 – acontell 2014-09-28 09:53:48

+0

btw谢谢你兄弟 – 2014-09-29 14:37:18