2013-01-23 8 views
14

Rozumiem, w jaki sposób działa okres datowania z jednym wyjątkiem, czy istnieje sposób, aby dowiedzieć się od daty, ile jest odstępów?Zliczanie iteracji PHP DatePeriod()

Tak na przykład:

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

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

To, co chciałbym zrobić z powyższego kodu:

echo count($period); 

Zasadniczo chcę wiedzieć, ile czasu pętla foreach skończy się systemem .

Odpowiedz

22

Można użyć funkcji iterator_count dla tego:

echo(iterator_count($period)); 
+5

Zauważ, że 'iterator_count' wewnętrznie iteruje po wszystkich elementach, aby je policzyć. Jeśli więc okres jest duży, a mimo to wykonujesz iterację za pomocą foreach, możesz samemu dokonać liczenia, co byłoby znacznie bardziej efektywne. –

-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

Nie ... jeśli musisz rozwiązać to z dziedziczeniem, przynajmniej implementuj interfejs 'Countable' zamiast zbytnio komplikować takie rzeczy. Ale tak czy inaczej, przedłużanie DatePeriod to zła praktyka. –

+2

Rozszerzenie standardowych bibliotek jest złą praktyką? Wszystkie rzeczy elektroniczne po prostu eksplodowały. – David

+0

Tak, * rozszerzenie * klas tylko w celu dodania funkcjonalności jest zazwyczaj złym pomysłem. Zobacz [Skład przez Dziedziczenie] (http://stackoverflow.com/questions/49002/prefer-composition-over-initance) (lub [tutaj] (http://en.wikipedia.org/wiki/Composition_over_inheritance) lub [tutaj ] (http://c2.com/cgi/wiki?CompositionInsteadOfInheritance). Czystą alternatywą jest tutaj [Dekorator] (http://en.wikipedia.org/wiki/Decorator_pattern), ponieważ pozwoliłoby to na niezależne dodawanie wielu funkcji. Ale w tym konkretnym przypadku, który byłby nad-inżynierii, 'iterator_count' i' iterator_to_array' dobrze wykonują zadanie –

1

Zakładając, że jesteś zainteresowany licząc liczbę dni tylko (niezależnie od spec interwału) - thx @ narzut Amery do wniesienia to u góry!

Innym bardziej oczywistym podejściem byłoby zróżnicowanie 2 dat i uzyskanie liczby dni od wyniku.

Upewnij się, aby sprawdzić swoje vary GET, aby uniknąć ostrzeżeń/błędów.

Lepiej późno niż wcale ;-)

EDIT:

Jeśli masz tylko obiekt z epoki masz dostęp do początku i na końcu okresu.

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

-1; zakłada to, że 'DatePeriod' ma 1 dzień' DateInterval', co nie musi być prawdą. –