سؤال
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