iterator_to_array - PullRequest
       23

iterator_to_array

7 голосов
/ 15 сентября 2009

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 

Ответы [ 3 ]

3 голосов
/ 15 сентября 2009

Вот что я бы сделал. Я бы расширил 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
3 голосов
/ 15 сентября 2009

Интересно, может быть, итератор не перематывается с помощью iterator_to_array (), поэтому второй вызов начинает итерацию с курсором в конце. Вы можете попробовать это:

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

Если итератор не перематывается, вы можете попробовать клонировать объект, прежде чем переходить его, например,

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

$array = iterator_to_array($p);
2 голосов
/ 15 сентября 2009

Предположительно, первый вызов проходит через все элементы итератора (то есть вызывает 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
...