Ich verstehe, wie der Datumszeitraum mit einer Ausnahme funktioniert. Gibt es eine Möglichkeit, anhand des Datumszeitraums herauszufinden, wie viele Intervalle es gibt?
Also zum Beispiel:
// define the period of the range
$period = new DatePeriod($begin, $rangeType, $end);
// iterate through the dates in range
foreach ( $period as $dt ) {
}
Folgendes möchte ich aus dem obigen Code machen:
echo count($period);
Grundsätzlich möchte ich wissen, wie oft die foreach Schleife wird am Ende ausgeführt.
Beachten Sie, dass iterator_count iteriert intern über alle Elemente, um sie zu zählen. Wenn also der Zeitraum groß ist und Sie ihn trotzdem mit foreach durchlaufen, können Sie das Zählen selbst durchführen, was viel effizienter wäre.
– Fabian Schmengler
23. Januar 2013 um 21:52 Uhr
4 Ebenen
Angenommen, Sie möchten nur die Anzahl der Tage zählen (unabhängig von der Intervallspezifikation) – danke @mark-amery, dass Sie dies angesprochen haben!
Ein anderer naheliegenderer Ansatz wäre, die 2 Daten zu unterscheiden und die Anzahl der Tage aus dem Ergebnis zu erhalten.
-1; dies setzt voraus, dass die DatePeriod hat 1 Tag DateIntervalwas nicht sein muss.
– Mark Amery
23. Dezember 2017 um 14:48 Uhr
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
Nö … wenn Sie dies mit Vererbung lösen müssen, implementieren Sie zumindest die Countable Benutzeroberfläche, anstatt solche Dinge zu verkomplizieren. Aber in jedem Fall ist das Erweitern von DatePeriod eine schlechte Praxis.
– Fabian Schmengler
23. Januar 2013 um 22:05 Uhr
Das Erweitern von Standardbibliotheken ist eine schlechte Praxis? Alle elektronischen Dinge sind gerade explodiert.
– David
23. Januar 2013 um 22:17 Uhr
Ja, verlängern Klassen, nur um Funktionalität hinzuzufügen, ist normalerweise eine schlechte Idee. Siehe Komposition über Vererbung (bzw hier oder hier. Eine saubere Alternative ist hier eine Dekorateur weil es das unabhängige Hinzufügen mehrerer Funktionen ermöglichen würde. Aber für diesen speziellen Fall wäre das Over-Engineering. iterator_count und iterator_to_array machen die Arbeit gut.
– Fabian Schmengler
23. Januar 2013 um 22:27 Uhr
Dir ist klar, dass all diese Links, die du bereitgestellt hast, mir eigentlich zustimmen, oder? Er möchte ein DateInterval, das eine bestimmte Eigenschaft hat. Dies bedeutet nicht, einen Apfel von einem orangefarbenen Szenario neu zu definieren, bei dem es um die Zusammensetzung geht, anstatt um die Vererbung (dh die Zusammensetzung sollte immer berücksichtigt werden, ist aber nicht immer der richtige Ansatz). Das Decorator-Muster eignet sich am besten für eine bis viele Kompositionen. Er fragte nicht, wie man einen eingebauten Typ auf 15 verschiedene Arten abstrahieren kann.
– David
23. Januar 2013 um 23:27 Uhr
-1; das ist ziemlich offensichtlich lächerlich. Sie fügen diese Funktionalität einer ganz separaten Klasse hinzu (was bedeutet, dass eine raw DatePeriod‘s Iterationen können nicht gezählt werden), um eine endgültige Syntax zu erzeugen – count($p->toArray()) – das ist komplizierter und nicht performanter als das iterator_count($p) die dir die Sprache schon gibt.
– Mark Amery
23. Dezember 2017 um 14:41 Uhr
14036900cookie-checkIterationen von PHP DatePeriod() zählenyes