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
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