DATEPERIOD est une classe PHP pour la manipulation des dates récurrentes. Il a un nombre très limité de méthodes. Ainsi, lorsque je veux faire des fonctions de tableau de base avec les dates récurrentes, je dois la copier sur un tableau avec itérator_to_array code>
. Étrangement, la copie il semble de l'encombrer. Des idées pourquoi?
3 Réponses :
Je me demande si peut-être que l'itérateur n'est pas ré-blessé par iterator_to_array (), le deuxième appel commence donc à itération du curseur à la fin. Vous pouvez essayer ceci:
$p2 = clone $p; echo count(iterator_to_array($p2)); $array = iterator_to_array($p);
Il semble que la délaye n'a pas de méthode de rembobinage. :( La documentation indique que DateCheCeiod implémente traverser. Mais traverser est une interface abstraite qui nécessite une interface abstraite qui nécessite une mise en œuvre d'itérateur ou d'itératoragragré (qui n'est pas non plus mentionnée dans les documents DATEPERODIOD). Itératoragregistré n'apparaît pas avoir une méthode de rembobinage public, donc peut-être peut-être la date à la date à la date. est un enfant de celui-ci plutôt que d'itérateur?
Malheureusement, le clone n'est pas une option. Il semble causer une erreur fatale, mais de quel type je ne sais pas car il ne se présente pas dans les journaux Web.
En ce qui me concerne, les nouvelles mises en œuvre de la date et de l'heure dans PHP 5.3 Suck Time.
Vraisemblablement, le premier appel parcourt tous les éléments de l'itérateur (c'est-à-dire appel suivant () jusqu'à ce que VALID () soit faux). Le comportement sensible est pour iterator_to_array de commencer la conversion de la position actuelle dans l'itérateur - le refouler silencieusement serait inflexible et éventuellement inducteur de bug.
Essayez de rembobiner l'itérateur avant de le reculer. P>
$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
Voici ce que je ferais. J'adverrais DateChypeiod Code> et implémenter un
TOARRAY CODE> Méthode:
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
Je ne comprends pas pourquoi itérator_to_array ($ ceci) à partir de l'intérieur de la classe ne fait pas la même chose que itérator_to_array ($ p) de l'extérieur. Mais je suis sûr que ça contient! Merci beaucoup.
Il fait la même chose, mais je cache le résultat dans une variable d'instance, $ dates code>, donc sur les appels suivants sur
toarray code> Il n'y a plus d'appels sur
itérator_to_array code>. J'ai simplement renvoyé le résultat mis en cache.
Désolé de cogner un post de deux ans, mais avez-vous réussi à savoir pourquoi cela se produit?