Pregunta

DatePeriod es una clase PHP para manejar fechas recurrentes. Tiene un número muy limitado de métodos. Entonces, cuando quiero hacer funciones básicas de matriz con las fechas recurrentes, tengo que copiarlo en una matriz con iterator_to_array . Curiosamente, copiarlo parece golpearlo. ¿Alguna idea de por qué?

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

Solución

Esto es lo que haría. Extendería DatePeriod e implementaría un método 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

Otros consejos

Me pregunto si quizás el iterador no está siendo rebobinado por iterator_to_array (), por lo que la segunda llamada comienza a iterar con el cursor al final. Puedes probar esto:

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

Si el iterador no es rebobinable, puede intentar clonar el objeto antes de atravesarlo, por ejemplo,

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

$array = iterator_to_array($p);

Presumiblemente, la primera llamada atraviesa todos los elementos en el iterador (es decir, llama a next () hasta que valid () sea falso). El comportamiento sensato es que iterator_to_array comience la conversión desde la posición actual en el iterador: tener que rebobinar en silencio sería inflexible y posiblemente induciría errores.

Intente rebobinar el iterador antes de usarlo nuevamente.

$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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top