我正在使用PHP制作一个事件管理系统。在这种情况下,事件可能会重复几天。在事件重复的情况下,数组将包含重复的结束日期,即;事件重复的结束日期。
array[] = array([0]=>array(
[name]=>test1
[start]=>2013-06-23 11:00
[end]=>2013-06-23 13:00
[repeat]=>true
[repeat-end]=>2013-06-25)
[1]=>array(
[name]=>test2
[start]=>2013-06-21 14:00
[end]=>2013-06-21 16:00
[repeat]=>false))
如果事件重复,那么数组必须填充所有数据,直到重复结束日期和相应的开始和结束。 在上述情况下,事件持续时间显示为开始和结束,重复结束日期显示为 repeat-end 。在此,应该填充数组,如下所示:
array[] = array([0]=>array(
[name]=>test1
[start]=>2013-06-23 11:00
[end]=>2013-06-23 13:00
[repeat]=>true
[repeat-end]=>2013-06-25)
[1]=>array(
[name]=>test2
[start]=>2013-06-21 14:00
[end]=>2013-06-21 16:00
[repeat]=>false
[2]=>array(
[name]=>test1
[start]=>2013-06-24 11:00
[end]=>2013-06-24 13:00
[repeat]=>true
[repeat-end]=>2013-06-25)
[3]=>array(
[name]=>test1
[start]=>2013-06-25 11:00
[end]=>2013-06-25 13:00
[repeat]=>true
[repeat-end]=>2013-06-25)
))
我尝试在这里使用php DatePeriod功能
foreach ($array as $result){
if($result['repeat == true']){
$period = new DatePeriod(
new DateTime($result['start']),
new DateInterval('P1D'),
new DateTime($result['repeat-end']), DatePeriod::EXCLUDE_START_DATE);
$period = iterator_to_array($period);
}
}
使用此开头和重复结束之间的所有日期,其中obatined和i插入的值将日期记录到数组中。但是我无法获得数组中的最后一个开始日期,并且当开始和结束日期[不重复结束]不同时,结束日期变得复杂。
答案 0 :(得分:0)
也许是这样的:(可能可以优化,但我觉得这很有效......或者如果它不能完全运作 - 这是一个好的开始:))
$array = array(
array(
'name'=>'test1',
'start'=>'2013-06-23 11:00',
'end'=>'2013-06-23 13:00',
'repeat'=>true,
'repeat-end'=>'2013-06-25'
),
array(
'name'=>'test2',
'start'=>'2013-06-21 14:00',
'end'=>'2013-06-21 16:00',
'repeat'=>false
)
);
$final=array();
foreach ($array as $sub)
{
if($sub['repeat']==1)
{
//print_r($sub);
$start_date = $sub['start'];
$end_date = $sub['repeat-end'];
$begin = new DateTime($sub['start'] );
$end = new DateTime( $sub['repeat-end'] );
$end = $end->modify( '+1 day' );
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);
foreach ( $period as $dt ) {
// echo $dt->format( "Y-m-d H:i" );
$new_day=$dt->format( "Y-m-d H:i" );
$new_end= new DateTime($dt->format( "Y-m-d H:i" ));
$new_end = $new_end->modify( '+2 hours' );
$temp=array();
$temp['name']=$sub['name'];
$temp['start']=$new_day;
$temp['end']=$new_end->format('Y-m-d H:i');
$temp['repeat']=true;
$temp['repeat-end']=$end_date;
$final[]=$temp;
}
}
}
//print_r($final);
$done=array_merge($array,$final);
$done=array_unique($done,SORT_REGULAR);
print_r($done);
答案 1 :(得分:0)
我认为您的问题不是在 $ result ['repeat-end'] 元素中添加时间戳。 2013-01-01:11:00和2013-01-02之间的天数小于1.因此,您应该在代码中替换此行:
new DateTime($result['repeat-end']);
这一个:
new DateTime($result['repeat-end'] . " 23:59:59");
此代码适用于您:
foreach ($array as $result){
if($result['repeat'] === true){
$date_start = new DateTime($result['start']);
//Becouse "time start" > "time repeat-end" you need add timestamp
$date_end = new DateTime($result['repeat-end'] . " 23:59:59");
$period = new DatePeriod($date_start,
new DateInterval('P1D'),
$date_end,
DatePeriod::EXCLUDE_START_DATE
);
//Adding new tests to the original array
foreach($period as $dt){
$result['start'] = $date_start->modify("+1 day")->setTime(11,0)->format('Y-m-d h:i');
$result['end'] = $date_start->modify("+2hours")->format('Y-m-d h:i');
$array[] = $result;
}
}
}
我希望它对你有用。