DatePeriod是一个用于处理重复日期的PHP类。它的方法数量非常有限。因此,当我想要使用重复日期执行基本数组函数时,我必须将其复制到具有iterator_to_array
的数组。奇怪的是,复制它似乎破坏了它。有什么想法吗?
$p=new DatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count(iterator_to_array($p)); //183
$a=iterator_to_array($p);
echo count($a); //0
答案 0 :(得分:3)
我想知道迭代器是否没有被iterator_to_array()重新缠绕,所以第二次调用开始迭代,最后是光标。你可以试试这个:
$p->rewind()
$a=iterator_to_array($p);
如果迭代器不可重绕,你可以尝试在遍历它之前克隆该对象,例如。
$p2 = clone $p;
echo count(iterator_to_array($p2));
$array = iterator_to_array($p);
答案 1 :(得分:3)
这就是我要做的。我会扩展DatePeriod
并实施toArray
方法:
class MyDatePeriod extends DatePeriod
{
public $dates;
public function toArray()
{
if ($this->dates === null) {
$this->dates = iterator_to_array($this);
}
return $this->dates;
}
}
$p = new MyDatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count($p->toArray()) . "\n"; // 183
echo count($p->toArray()) . "\n"; // 183
答案 2 :(得分:2)
据推测,第一个调用遍历迭代器中的所有元素(即调用next()直到valid()为false)。明智的行为是iterator_to_array从迭代器中的当前位置开始转换 - 让它静默地倒回将是不灵活的,并且可能是错误诱导。
尝试重新使用迭代器,然后再使用它。
$p=new DatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count(iterator_to_array($p)); //183
$p->rewind(); // Newly added!
$a=iterator_to_array($p);
echo count($a); //0