iterator_to_array

3 Cevap php

3 Cevap

İşte ben öyle yapardım. I DatePeriod uzatmak ve bir toArray yöntemi uygulamak istiyorum:

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

Belki yineleyici iterator_to_array (tarafından yeniden sarılmaktadır değilse I) acaba, yani ikinci çağrı sonunda imleç ile yineleme başlar. Bu deneyebilirsiniz:

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

Yineleyici sarılabilir değilse bunu çapraz önce, örneğin, nesneyi klonlama deneyebilirsiniz

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

$array = iterator_to_array($p);

Muhtemelen, ilk çağrı (() false kadar geçerlidir yani çağırır sonraki ()) yineleyici tüm unsurları erişir. Sessizce esnek olurdu geri sarma, ve muhtemelen hata oluşturmama sahip - iterator_to_array yineleyici geçerli konumdan dönüşüm başlatmak için mantıklı bir davranıştır.

Tekrar kullanmadan önce yineleyici sarma deneyin.

$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