Pergunta

DatePeriod é uma classe PHP para lidar com datas recorrentes. Possui um número muito limitado de métodos. Então, quando eu quero fazer funções básicas de matriz com as datas recorrentes, tenho que copiá -lo para uma matriz com iterator_to_array. Estranhamente, copiá -lo parece brotar. Alguma idéia do porquê?

$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 
Foi útil?

Solução

Aqui está o que eu faria. Eu estenderia DatePeriod e implementar a toArray método:

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

Outras dicas

Gostaria de saber se talvez o iterador não esteja sendo re-enrolado por iterator_to_array (), então a segunda chamada começa a iterando com o cursor no final. Você poderia tentar o seguinte:

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

Se o iterador não for retrocedível, você pode tentar clonar o objeto antes de atravessá -lo, por exemplo

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

$array = iterator_to_array($p);

Presumivelmente, a primeira chamada atravessa todos os elementos do iterador (ou seja, chama a seguir () até que o Valid () seja falso). O comportamento sensível é que o iterator_to_array inicie a conversão da posição atual no iterador - tê -lo em silêncio seriam inflexíveis e possivelmente indutores de bug.

Tente rebobinar o iterador antes de usá -lo novamente.

$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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top