我正在尝试为PHP中的重复事件实现 Martin Fowler 的类模型。DateTime和DatePeriod PHP 对象看起来很适合处理时间表达式。问题是我需要能够在 DatePeriods 上执行 UNION、INTERSECT 和 DIFFERENCE 操作,以便我可以计算像“每个星期二,除了偶数日期”这样的表达式。该示例需要“每个星期二”DatePeriod 和“偶数日期”DatePeriod 的差异。
array_intersect()
DatePeriod 是可迭代的,但标准数组处理函数(如and )无法访问它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:克隆发生了什么?
谢谢大家!