2

我正在尝试为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:克隆发生了什么?

谢谢大家!

4

1 回答 1

1

I had a similar question last year, although for me, I was having difficulty with relating it to a persistence layer. For the application layer, one approach is to divide up the job into one set of classes that handles the set operations (intersection, union, difference) and one that handles the "temporal expressions" (every month, last day of month). The temporal classes can then be composed together to generate arbitrarily complex date conditions.

I've written about this topic and provided sample classes here and here.

于 2010-02-07T14:29:12.633 回答