2013-01-23 16 views
14

日付の期間が1つの例外を除いてどのように機能するかを理解しています。例えばのでPHP DatePeriod()の反復回数をカウントする

// define the period of the range 
$period = new DatePeriod($begin, $rangeType, $end); 

// iterate through the dates in range 
foreach ($period as $dt) { 
} 

これは私が上記のコードからやりたいものです。

echo count($period); 

は基本的に私はforeachループが実行されていることになりますどのように多くの時間を知りたいです。

答えて

22

あなたはこのためにiterator_count機能を使用することができます。あなただけ(関係なく、間隔仕様の)日数を数えることに興味があると仮定すると

echo(iterator_count($period)); 
+5

「iterator_count」は、内部的にすべてのアイテムを繰り返してカウントすることに注意してください。したがって、期間が長く、foreachを使用してそれを繰り返す場合は、自分で計算を行うことができます。これははるかに効率的です。 –

-2
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 
+0

いいえ...継承でこれを解決する必要がある場合は、少なくともそのような複雑なものではなく、 'Countable'インターフェイスを実装する必要があります。しかしどちらの方法でも、DatePeriodを拡張するのは悪い習慣です。 –

+2

標準ライブラリを拡張するのは悪い習慣ですか?すべてのものがちょうど爆発した。 – David

+0

はい、*機能を追加するためだけに*拡張*クラスは、通常、悪い考えです。 [継承上の合成](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance)(または[ここ](http://en.wikipedia.org/wiki/Composition_over_inheritance)または[ここをクリック](http://c2.com/cgi/wiki?CompositionInsteadOfInheritance)ここでクリーンな代替案は、[Decorator](http://en.wikipedia.org/wiki/Decorator_pattern)です。複数の機能を個別に追加できるからです。 –

1

- 持ち込むためのTHX @マーク-アメリーをこれを!

さらに明らかなアプローチは、2つの日付を比較し、結果から日数を得ることです。

$numDays = $end->diff($begin)->days; 
$numDaysFormatted = $end->diff($begin)->format('%d days'); 

日付の警告/エラーを避けるため、必ずGETの有効性を検証してください。

決して;-)

EDITより良い後半:

あなただけが期間の開始と終了へのアクセス権を持っている期間のオブジェクトを持っている場合。

$numDays = $period 
    ->getEndDate() 
    ->diff($period->getStartDate()) 
    ->days; 
+0

-1;これは、 'DatePeriod'が1日の' DateInterval'を持っていることを前提としています。 –

関連する問題