Question

DatePeriod est une classe PHP permettant de gérer des dates récurrentes. Il a un nombre très limité de méthodes. Ainsi, lorsque je veux effectuer des fonctions de tableau de base avec les dates récurrentes, je dois le copier dans un tableau avec iterator_to_array . Bizarrement, le copier semble le casser. Des idées pourquoi?

$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 
Était-ce utile?

La solution

Voici ce que je ferais. J'étendrais DatePeriod et implémenterais une méthode 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

Autres conseils

Je me demande si l'itérateur n'est pas remonté par iterator_to_array (), alors le deuxième appel commence à itérer avec le curseur à la fin. Vous pouvez essayer ceci:

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

Si l'itérateur n'est pas rembobinable, vous pouvez essayer de cloner l'objet avant de le parcourir, par exemple.

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

$array = iterator_to_array($p);

Vraisemblablement, le premier appel traverse tous les éléments de l’itérateur (c’est-à-dire appelle next () jusqu’à ce que valid () soit false). Le comportement judicieux consiste pour iterator_to_array à commencer la conversion de la position actuelle dans l'itérateur. Le fait de la rembobiner silencieusement serait inflexible et risquerait de provoquer un bug.

Essayez de rembobiner l'itérateur avant de le réutiliser.

$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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top