2014-01-25 4 views
0

현재 이벤트 날짜를 나타내는 DateTimes 배열이 있습니다. 나는 매주 반복되는 이벤트를 찾고 그들을 하나로 묶으려고 노력하고있다. 예를 들어PHP Group Weekly Events

: 저는 현재 다음 날짜에 7 일 추가, 배열의 시작 부분에서 시작 반복하여이 일을 해요

2014-01-27T00:00:00+01:00 
2014-02-03T00:00:00+01:00 
2014-02-10T00:00:00+01:00 
2014-02-17T00:00:00+01:00 

2014-04-28T00:00:00+02:00 
2014-05-05T00:00:00+02:00 

:

2014-01-27T00:00:00+01:00 
2014-02-03T00:00:00+01:00 
2014-02-10T00:00:00+01:00 
2014-02-17T00:00:00+01:00 
2014-04-28T00:00:00+02:00 
2014-05-05T00:00:00+02:00 

로 분할된다 전체 배열을 통해 일치하는 것이 있는지 확인합니다. 일치하는 것이 발견되면 스택에 추가하고 프로세스를 반복합니다.

더 간단한 접근 방법이 있습니까?


실제 코드 :

$dateGroups = array(); 

    while(!empty($remainingDates)) { 

     // Get the first item 
     $startDate = array_shift($remainingDates); 

     $currentDate = $startDate; 
     $repeatCount = 1; 

     foreach($remainingDates as $key => $date) { 
      $interval = $currentDate->diff($date); 
      if($interval->d == 7) { 
       unset($remainingDates[$key]); 
       $repeatCount++; 
       $currentDate = clone $date; 
      } 
     } 
     $endDate = $currentDate; 

     $dateGroups[] = array('start' => $startDate, 'end' => $endDate, 'occurrences' => $repeatCount); 

    } 
+2

작은 최적화는 사용했을 때 원래 배열에서 요소를 제거하여 이후 검색에서 배열이 작아 지도록합니다. – jeroen

+0

@jeroen 좋은 지적, 나는 요소를 바꿀 수 있다고 생각한다. –

+0

중간에 어울리는 부분을 발견하면 설정을 해제한다. 첫 번째 루프 후에 orignal 예제 배열에는 나머지 2 개 항목 만 포함됩니다. – jeroen

답변

1

체크 아웃 PHP에서이 기능 http://www.php.net/manual/en/datetime.diff.php

그것은 당신에게 두 날짜 사이의 차이, 당신은 다른 날짜를 스캔 칠일 차이를 찾을 수 있습니다 (또는 얻을 $ diff-> d % 7 == 0) 그리고 그 그룹에 의해 그룹화하십시오 ..

% 7 == 0을 사용하여 그룹의 테이블로 사전 정렬하고 필요하면 무결성을 검사하십시오 매주 일어나는 날짜 만. 속도를 올려야합니다.