0

我正在尝试什么

我正在使用 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))

我需要什么

如果事件重复,则数组必须填充所有数据,直到重复结束日期和相应的开始和结束。在上述情况下,事件持续时间显示为startend,重复结束日期显示为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);
       }
     }

使用这个开始和重复结束之间的所有日期,其中 obtianed 并且我将每个日期的值插入到数组中。但是我无法获得数组中的最后一个开始日期,并且当开始日期和结束日期 [not repeat-end] 不同时,结束日期变得复杂。

4

2 回答 2

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;
        }
    }
}

我希望它对你有用。

于 2013-06-23T18:56:50.580 回答
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);
于 2013-06-23T16:50:58.477 回答