2013-01-23 83 views
14

我瞭解日期期間如何工作,但有一個例外,是否有方法從日期期間找出有多少間隔?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'內部遍歷所有項目來計算它們。所以如果這段時間很長,並且反覆遍歷它,那麼可以自己進行計數,這樣會更加高效。 –

-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),因爲它可以獨立地添加多個功能。但是對於這種特定的情況,這將是過度工程,'iterator_count'和'iterator_to_array'很好地完成這項工作 –

1

假設你有興趣計數的天數只(不考慮間隔規範的) - THX @馬克 - 阿梅里奧爲使這起來!

另一個更明顯的方法是比較兩個日期並獲得結果的天數。

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

務必驗證您的GET變量以避免日期警告/錯誤。比

猶未晚從未;-)

編輯:

如果你只有你有訪問週期的開始和結束期間的對象。

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

-1;這假定'DatePeriod'具有1天'DateInterval',不一定是這種情況。 –