7

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 
4

3 回答 3

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);
于 2009-09-15T13:17:41.887 回答
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
于 2009-09-15T13:56:26.970 回答
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
于 2009-09-15T13:18:09.843 回答