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 
有帮助吗?

解决方案

这就是我要做的。我将扩展 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

其他提示

我想知道迭代器是否没有被iterator_to_array()重新缠绕,所以第二次调用开始迭代,最后是光标。你可以试试这个:

$p->rewind()
$a=iterator_to_array($p); 

如果迭代器不可重绕,你可以尝试在遍历它之前克隆该对象,例如。

$p2 = clone $p;
echo count(iterator_to_array($p2));

$array = iterator_to_array($p);

据推测,第一个调用遍历迭代器中的所有元素(即调用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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top