このプログラミングの問題に対する洗練された解決策があるかどうか疑問に思いました。
次の条件を満たすイベントの日付があります。
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。日付を比較するためにDateTimePHPオブジェクトを使用しています。
これはどういうわけか改善することができますか、または条件はこの場合に行く唯一の方法ですか?正確なコードは必要ありません。アイデアだけです。
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') {
}
}
通常、関数を使用してコードを短縮できます。ただし、これにはクラスの方が適していると思います。
class DateRange{
public $from, $to;
public function inBetween($outer){
return $this->from >= $outer->from && $this->to <= $outer->to;
}
function __construct($from, $to){
if($a = $from->getTimestamp() == $b = $to->getTimestamp()){
throw new \Exception('A period cannot be the same time');
} else {
if($a < $b){
$this->from = $a;
$this->to = $b;
} else {
$this->from = b;
$this->to = $a;
}
}
}
}
$today = new Datetime();
$lastyear = (new Datetime())->modify('-1 year');
$from = (new Datetime())->modify('-9 month');
$outer = new DateRange($lastyear, $today);
$inner = new DateRange($from, $today);
if($inner->inBetween($outer)){
echo 'it is';
} else {
echo 'it isnt';
}
inBetween()
この方法で適切と思われるように、メソッドをさらに追加できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加