2013-01-23 8 views
14

Capisco come funziona il periodo della data con un'eccezione, c'è un modo per scoprire dal punto della data quanti intervalli ci sono?Contare le iterazioni di PHP DatePeriod()

Così, per esempio:

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

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

questo è quello che vorrei fare dal codice di cui sopra:

echo count($period); 

Fondamentalmente voglio sapere quante volte il ciclo foreach finirà in esecuzione .

risposta

22

è possibile utilizzare la funzione di iterator_count per questo:

echo(iterator_count($period)); 
+5

Si noti che 'iterator_count' esegue internamente iterazioni su tutti gli elementi per contarli. Quindi se il periodo è ampio e lo iterate comunque con foreach puoi fare il conteggio te stesso, che sarebbe molto più efficiente. –

-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

No ... se è necessario risolvere questo problema con l'ereditarietà, implementare almeno l'interfaccia "Countable" invece di complicare eccessivamente le cose in questo modo. In ogni caso, estendere DatePeriod è una cattiva pratica. –

+2

L'estensione delle librerie standard è una cattiva pratica? Tutto elettronico è appena esploso. – David

+0

Sì, * l'estensione * delle classi solo per aggiungere funzionalità è solitamente una cattiva idea. Vedi [Composizione sull'ereditarietà] (http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) (o [qui] (http://en.wikipedia.org/wiki/Composition_over_inheritance) o [qui ] (http://c2.com/cgi/wiki?CompositionInsteadOfInheritance). Un'alternativa pulita qui è un [Decorator] (http://en.wikipedia.org/wiki/Decorator_pattern) perché consente di aggiungere più funzionalità in modo indipendente. Ma per questo caso specifico che sarebbe troppo ingegneristico, 'iterator_count' e' iterator_to_array' fanno bene il lavoro –

1

Supponendo che siete interessati a contare il numero di giorni solo (indipendentemente dall'intervallo spec) - thx @ mark-Amery per portare questo su!

Un altro approccio più ovvio sarebbe quello di diffare le 2 date e ottenere il numero di giorni dal risultato.

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

Assicurati di convalidare le tue VAR GET per evitare avvisi/errori di data.

Meglio tardi che mai ;-)

EDIT:

Se avete solo un oggetto periodo si ha accesso a l'inizio e la fine del periodo.

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

-1; questo presuppone che 'DatePeriod' abbia un 'DateInterval' di un giorno, che non deve essere il caso. –

Problemi correlati