سؤال

DatePeriod هي فئة PHP للتعامل مع التواريخ المتكررة. لديها عدد محدود للغاية من الطرق. لذلك عندما أرغب في القيام بوظائف المصفوفة الأساسية مع التواريخ المتكررة ، يجب علي نسخها إلى صفيف مع iterator_to_array. الغريب ، نسخ يبدو أنه يتجول. أي أفكار لماذا؟

$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 
هل كانت مفيدة؟

المحلول

هذا ما سأفعله. سأمتد DatePeriod وتنفيذ أ 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

نصائح أخرى

أتساءل ما إذا كان ربما لا يتم إعادة التكرار بواسطة iterator_to_array () ، لذلك تبدأ المكالمة الثانية في التكرار مع المؤشر في النهاية. يمكنك تجربة هذا:

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

إذا لم يكن التكرار غير قابل للتوجيه ، فيمكنك محاولة استنساخ الكائن قبل اجتيازه ، على سبيل المثال

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

$array = iterator_to_array($p);

من المفترض أن المكالمة الأولى تعبر جميع العناصر الموجودة في المؤلف (أي مكالمات Next () حتى تكون صالحة () خاطئة). السلوك المعقول هو لـ ITerator_to_array لبدء التحويل من الموضع الحالي في التكرار - لأن إعادة الترجيع بصمت سيكون غير مرن ، وربما تحفيز الأخطاء.

حاول إعادة ربط التكرار قبل استخدامه مرة أخرى.

$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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top