2017-11-30 8 views
0

저는 X 일마다 이벤트를 생성 할 수있는 웹 사이트에서 일하고 있습니다. 여기서 X는 요일의 이름입니다. 그런 다음 장래에 원하는 이벤트 수를 입력해야합니다.몇 주 동안 반복해서 몇 일간의 정확한 날짜를 찾으려면 어떻게해야합니까?

예를 들어, 사용자는 매주 월요일과 화요일을 선택하고 150 개의 이벤트를 작성하기로 결정합니다. 여기

지금까지 내가 만든 코드입니다 :

// Init the date counter    
$cpt_date_found = 0; 

// Number of date to find 
$rec_occ = 150; 

// Init an ending date far in the future   
$endDate = strtotime('+10 years', time()); 

// Loop over the weeks 
for($i = strtotime('Monday', strtotime(date("d.m.Y"))); $i <= $endDate; $i = strtotime('+1 week', $i)) { 

    // -- Monday date found, create the event in the database 

    $cpt_date_found++; 

    // Break the loop if we have enough dates found 
    if($cpt_date_found == $rec_occ) { 
     break; 
    } 

} 

이 코드는 앞으로 매주 월요일의 날짜를 찾아 우리가 사용자가 지정한 발생 횟수에 도달하면 루프를 중단.

앞으로 끝나는 날짜를 입력하여 사용자가 지정한 발생 횟수가 끝나기 전에 루프를 끊을 수 있는지 확인하십시오.

처음에는 코드의 "품질"에 대해 확신하지 못합니다 ... 루프를 깨는 것이 최선의 방법은 아니며 다른 솔루션이 내 요구에 더 잘 맞는지 궁금합니다.

그런 다음 사용자가 며칠 (월요일, 화요일 및 금요일)을 지정한 경우 루프를 반복하는 대신 지정된 요일마다 한 번 루프를 반복 할 수 있습니까?

감사합니다.

+1

https://stackoverflow.com/a/33329004/8165478이 답변은 원하는대로 수행해야합니다. – Vindur

답변

0

다음 코드는 5 년 동안 반복됩니다. 이 5 년 동안 매주마다 해당 주간의 각 요일을 포함하는 DatePeriod가 생성됩니다. 당신이 찾고있는 날짜와 함께 각각의 요일을 미리 설정된 배열과 비교합니다. 그러면 코드가 일정 시간 동안 카운트 다운되는 이벤트를 생성 할 수 있습니다. 카운터가 0이되면 완료됩니다.

$searchDates = array('Mon', 'Tue', 'Fri'); 
$amountOfTimes = 27; 

$startDate = new DateTime(); 
$endDate = new DateTime('next monday'); 
$endDate->modify('+5 years'); 

$interval = new DateInterval('P1W'); 
$dateRange = new DatePeriod($startDate, $interval ,$endDate); 

// Loop through the weeks 
foreach ($dateRange as $weekStart) { 
    $weekEnd = clone $weekStart; 
    $weekEnd->modify('+6 days'); 

    $subInterval = new DateInterval('P1D'); 

    // Generate a DatePeriod for the current week 
    $subRange = new DatePeriod($weekStart, $subInterval ,$weekEnd); 
    foreach ($subRange as $weekday) { 
     if (in_array($weekday, array('Mon', 'Fri', 'Sun'))) { 
      // Create event 

      // Countdown 
      $amountOfTimes--; 
     } 

     if ($amountOfTimes == 0) { 
      break; 
     } 
    } 
}