Iterationen von PHP DatePeriod() zählen

Lesezeit: 3 Minuten

Benutzeravatar von Tom Bird
Tom Vogel

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.

Benutzeravatar von DiverseAndRemote.com
DiverseAndRemote.com

Du kannst den … benutzen iterator_count Funktion dazu:

echo(iterator_count($period));

  • 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

Benutzeravatar von 4levels
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.

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

Stellen Sie sicher, dass Sie Ihre GET-Variablen validieren, um Datumswarnungen / -fehler zu vermeiden.

Besser spät als nie 😉

BEARBEITEN:

Wenn Sie nur ein Periodenobjekt haben, haben Sie Zugriff auf Beginn und Ende der Periode.

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

  • -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

1403690cookie-checkIterationen von PHP DatePeriod() zählen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy