我試圖在PHP中實現Martin Fowler's class model for recurring events。 DateTime和DatePeriod PHP對象看起來很適合處理時態表達式。問題是我需要能夠對DatePeriods執行UNION,INTERSECT和DIFFERENCE操作,這樣我就可以計算「除了日期都是偶數的每個星期二」之類的表達式。該示例需要「每週二」DatePeriod和「偶數日期」DatePeriod的差異。時間表達與DatePeriod?
DatePeriod是可迭代的,但它不能被標準數組處理函數如array_intersect()
和array_diff()
訪問。 (我希望!)所以我嘗試將DatePeriod更改爲$ap=array_to_iterator($dp)
的數組。這大多按預期工作,除了DatePeriod包含的DateTime對象沒有__toString()
方法,這是許多陣列函數需要的。
我最近一次嘗試是最接近:
function recur_union($p1,$p2){
$a1=(is_object($p1)) ? iterator_to_array($p1):$p1;
$d_arr=recur_difference($p2,$a1);
return array_merge($a1,$d_arr);
}
function recur_difference($p1,$p2){
$arr=array();
$a2=(is_object($p2)) ? iterator_to_array($p2):$p2;
foreach($p1 as $dt){
if(!in_array($dt,$a2))$arr[]=$dt;
}
return $arr;
}
$p1=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString("+2 days"),date_create('2008-12-31'));
$p2=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString("+7 days"),date_create('2008-12-31'));
$au=recur_union($p1,$p2);
$ad=recur_difference($p1,$p2);
echo $au, $ad;
不幸的是,看來DatePeriods $ P1和P2 $得到處理期間重挫。如果我先輸入recur_union($p1,$p2)
,我會得到一個有效的結果。如果在recur_difference($p1,$p2)
之後完成,則recur_union
返回空數組。 recur_difference
也發生同樣的情況。
問題1:任何人都可以解釋爲什麼iterator_to_array
似乎抹殺原有DatePeriod?
由於我的DatePeriods被破壞,我想我會嘗試克隆它們。但下列原因IE8顯示「無法顯示網頁」的消息,並FF3.5什麼都不做:
$p1=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString("+2 days"),date_create('2008-12-31'));
$p2=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString("+7 days"),date_create('2008-12-31'));
$a1=clone $p1;
$a2=clone $p2;
$au=recur_union($p1,$p2);
$ad=recur_difference($a1,$a2);
echo $au, $ad;
問題2:這是怎麼回事與克隆?
謝謝大家!
這是一個有趣的事情。我最終將DatePeriod擴展到了一個名爲Recurrence的類,該類可以像數組一樣訪問,並且在克隆時沒有任何問題。然後我創建了Temporal_Expression類(union,difference,intersect),它們知道如何使用Recurrence對象進行設置操作。操作如何分組和排序的邏輯將在更高層次上處理。 – dnagirl 2010-02-08 13:51:14