我有日期数组,例如:
$dates = array('2013-01-30', '2013-01-31', '2013-02-01', '2013-02-02', '2013-04-04', '2013-04-05', '2013-04-06');
如何为这些日期制作间隔的最佳方法是什么? 我想收到:
$interval = array(
array('first' => '2013-01-30', 'last' => '2013-02-02'),
array('first' => '2013-04-04', 'last' => '2013-04-06')
);
首先这是第一个从数组或第一个日期尚未分配的日期。上次日期是下一个日期为空的日期。例如 - 2013-02-02 - next应该是2013-02-03,但这不在数组中,因此2013-02-02是间隔中的最后一个。
答案 0 :(得分:0)
这是一个示例函数及其用法,我有时会使用它。更改函数中的格式使其看起来像您的日期
function dateRange( $first, $last, $step = '+1 day', $format = 'Y/m/d' ) {
$dates = array();
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
print_r( dateRange( '2010/07/26', '2010/08/05') );
Array (
[0] => 2010/07/26
[1] => 2010/07/27
[2] => 2010/07/28
[3] => 2010/07/29
[4] => 2010/07/30
[5] => 2010/07/31
[6] => 2010/08/01
[7] => 2010/08/02
[8] => 2010/08/03
[9] => 2010/08/04
[10] => 2010/08/05
)
也不过几周了:
print_r( dateRange( '2010/07/26', '2010/08/05', '+1 week') );
Array (
[0] => 2010/07/26
[1] => 2010/08/02
)
所以在你的情况下,你会像这样使用它:
print_r(dateRange($interval[0]['first'], $interval[0]['last']));
答案 1 :(得分:0)
要查找连续的日期范围,您必须确定每个日期是否在最后一个范围的末尾。如果是,则扩展该范围;如果没有,则创建一个新范围。
$dates = array('2013-01-30', '2013-01-31', '2013-02-01', '2013-02-02', '2013-04-04', '2013-04-05', '2013-04-06');
$ranges = array();
$current = 0;
foreach ($dates as $date) {
if (isset($ranges[$current])) {
// existing range
if ($date == date('Y-m-d', strtotime("{$ranges[$current]['last']} +1 day"))) {
$ranges[$current]['last'] = $date; // expand
} else {
++$current; // move to a new range
}
}
// create new range
if (!isset($ranges[$current])) {
// create new range
$ranges[$current] = array('first' => $date, 'last' => $date);
}
}
print_r($ranges);