2009-09-14 16 views
2

我試圖在PHP中實現Martin Fowler's class model for recurring eventsDateTimeDatePeriod 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:這是怎麼回事與克隆?

謝謝大家!

回答

1

去年我有一個類似的問題,雖然對於我來說,我很難將它與持久層相關聯。對於應用層,一種方法是將作業分成一組處理集合操作(​​交集,聯合,差異)的類和一個處理「時態表達式」(每月,每月的最後一天)的類。然後可以將時間類組合在一起以生成任意複雜的日期條件。

我寫這個話題,並提供樣品類herehere

+0

這是一個有趣的事情。我最終將DatePeriod擴展到了一個名爲Recurrence的類,該類可以像數組一樣訪問,並且在克隆時沒有任何問題。然後我創建了Temporal_Expression類(union,difference,intersect),它們知道如何使用Recurrence對象進行設置操作。操作如何分組和排序的邏輯將在更高層次上處理。 – dnagirl 2010-02-08 13:51:14