2
私は、このプログラミングの問題に対する洗練された解決方法があるのだろうかと思っていました。日付/期間が別の日付/期間内にあるかどうかを確認する - より洗練された解決策が可能ですか?
、以下の条件を満たしているイベントの日付があります:
1) it can be 'from' - 'to'
2) OR it can be 'from'
AND (repeating at defined intervals n times OR indefinitely).
The interwals can be day/week/month or year
そのイベントの参加者があります。 (S)彼は彼/彼女が利用できないときに、期間/日付を添付することがあります。
私は、参加者の「使用できない」日付かどうかを確認する必要があり1) the date can be 'from' - 'to'
2) the date can be only 'from'
3) the date can be only 'to'
- 存在する場合は、 - イベントの日付とどのような方法で重なっています。
今のところ、ホットスポットまたは条件です。コードが終了していない、私はさらに追加する必要があります。言語 - PHP。私は日付を比較するためのDateTime PHPオブジェクトを使用しています。
これは何らかの形で改善することができますか、この場合、条件は唯一の方法ですか?私は、正確なコード、単なるアイデアは必要ありません。
if($event->recurring === '0') {
// Non recurring event
if($eventEndValid && $userFromValid && $userToValid) { $user->available = ($userFrom < $eventStart && $userTo < $eventStart) || ($userFrom >= $eventEnd && $userTo > $eventEnd); }
else if($userFromValid && $userToValid) { $user->available = ($userFrom < $eventStart) && ($userTo <= $eventStart); }
else if(!$eventEndValid && !$userToValid) { $user->available = false; }
else if(!$eventEndValid && !$userFromValid) { $user->available = $userTo <= $eventStart; }
else if($eventEndValid && !$userToValid) { $user->available = $userFrom >= $eventEnd; }
else if($eventEndValid && !$userFromValid) { $user->available = $userTo <= $eventStart; }
} else {
$dIntStr = 'P';
switch($event->recurring_frequency) {
case '1':
$dIntStr .= '1D';
break;
case '2':
$dIntStr .= '1W';
break;
case '3':
$dIntStr .= '1M';
break;
case '4':
$dIntStr .= '1Y';
break;
}
// Case 1
if(!$userToValid) { $user->available = false; }
if((!$userFromValid && $userToValid)) { $user->available = $userTo <= $eventStart; }
// Case 2 - number of intervals is unlimited
if($event->recurring_frequency === '0') {
if($userToValid && $userTo <= $eventStart) { $user->available = true; }
else if($userTo > $eventStart) {
// If unavailability is between the intervals then true
$user->available = true;
}
else { $user->available = false; }
}
// Case 2 - number of intervals is limited
$dateInterval = DateInterval($dIntStr);
if($event->recurring_frequency === '0') {
}
}
ありがとうございました。このアプローチは本当にうまくいった。最初は、新しいクラスを作成するにはあまりにも多くのコードが必要になると思っていましたが、これは本当のことですが、コードは読みやすく保守しやすくなりました。コード:[DateRangeHelper class](https://bitbucket.org/al2357/php_snippets/src/d947a38689605ca58d8da3e6a1401b7e37659630/DateRangeHelper/DateRangeHelper.php?at=master&fileviewer=file-view-default) – Alan