Domanda

DatePeriod è una classe PHP per la gestione di date ricorrenti. Ha un numero molto limitato di metodi. Quindi, quando voglio svolgere le funzioni di base dell'array con le date ricorrenti, devo copiarlo in un array con iterator_to_array . Stranamente, copiarlo sembra bloccarlo. Qualche idea sul perché?

$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 
È stato utile?

Soluzione

Ecco cosa farei. Estenderei DatePeriod e implementerei un metodo 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

Altri suggerimenti

Mi chiedo se forse l'iteratore non viene riavvolto da iterator_to_array (), quindi la seconda chiamata inizia a scorrere con il cursore alla fine. Puoi provare questo:

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

Se l'iteratore non è riavvolgibile, potresti provare a clonare l'oggetto prima di attraversarlo, ad esempio

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

$array = iterator_to_array($p);

Presumibilmente, la prima chiamata attraversa tutti gli elementi nell'iteratore (cioè chiamate next () fino a valid () è falso). Il comportamento ragionevole è che iterator_to_array inizi la conversione dalla posizione corrente nell'iteratore: il riavvolgimento silenzioso sarebbe inflessibile e potrebbe indurre bug.

Prova a riavvolgere l'iteratore prima di riutilizzarlo.

$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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top