Как пройтись по неделям и найти точную дату нескольких дней?

Я работаю над сайтом, на котором пользователь может создавать события каждые 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;
}

}

Этот код находит дату каждого понедельника в будущем и прерывает цикл, как только мы достигли числа вхождений, указанных пользователем.

Я ввел дату окончания в далеком будущем, чтобы удостовериться, что смогу разорвать цикл до конца числа вхождений, указанного пользователем.

Во-первых, я не уверен в «качестве» моего кода … Я знаю, что разрыв цикла — не лучшая идея, и мне интересно, подойдет ли другое решение для моих нужд.

Тогда, вместо того, чтобы повторять цикл несколько раз, если пользователь указал несколько дней (скажем, понедельник, вторник и пятница), есть ли способ выполнить цикл один раз для каждых предоставленных дней?

Спасибо!

0

Решение

Следующий код будет повторяться в течение 5 лет. Для каждой недели в течение этих 5 лет будет генерироваться DatePeriod содержащий каждый день этой недели. Он будет сравнивать каждый из этих дней с вашим заданным массивом с днями, которые вы ищете. Затем вы можете сгенерировать ваше событие, после чего код будет отсчитываться некоторое количество раз. Если счетчик достигает нуля, все готово.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]