比较日期值之间的两个阵列
所以,我有两个数组中的一些日期:比较日期值之间的两个阵列
$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(
);
我在比较函数中会错过什么吗? 我需要您的意见,大家好,谢谢:)
试试这个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;
}
有一些在你的例子日期的空间。这是你应该纠正的错误。
在这里,你有内心的痕迹如果。
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) { }
无论如何,我不知道你在找什么。你想达到什么目的?
我正在寻找不在$ old_1数组中的$ new_1数组中的日期范围(start_date - end_date)。 抱歉,我只是不提及,$ old_1数组是从数据库/表中提取的,$ new_1数组是从服务中提取的。我想将不在数据库/表中的新提取的数据插入到其中。 – 2014-09-28 06:14:14
friedi的解决方案应该可以正常工作。 – acontell 2014-09-28 09:53:48
btw谢谢你兄弟 – 2014-09-29 14:37:18
我稍后再试, – 2014-09-28 06:32:30
你好, 是的,它的工作,现在我得到了我期望的结果。 有新的问题,在数组$ 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
所以$ expected_1的正确值是一个空数组(),因为10-12和10-17因重叠而被删除。 谢谢 – 2014-09-29 14:34:02