Datum Prüfen
Paul
- php
Moinser...
Ich hantiere gerade mit Zeit-Daten (Datum) herum und stehe gleich vor zwei Herausvorderungen:
1.) Ich habe ein Array mit verschiedensten Daten (Datum) drin und möchte diese gerne sortieren. Beispiel:
array[20.06.07],[25.06.07],[01.07.07],[u.s.w.]
Am besten wäre in Richtung Zukunft.
2.) Ich möchte prüfen ob das jeweilige Datum in der Zukunft liegt, oder aber schon Vergangenheit ist.
Ich habe mich breits reingelesen in checkdate und anderen Dingen.
Habe allerdings nichts gefunden, was mir in meinem Problemchen helfen könnte.
Freue mich also auf zahlreiche Anregungen.
Vielen Dank dafür
Besten Gruß
Paul
hi,
1.) Ich habe ein Array mit verschiedensten Daten (Datum) drin und möchte diese gerne sortieren. Beispiel:
array[20.06.07],[25.06.07],[01.07.07],[u.s.w.]2.) Ich möchte prüfen ob das jeweilige Datum in der Zukunft liegt, oder aber schon Vergangenheit ist.
Ich habe mich breits reingelesen in checkdate und anderen Dingen.
Mach Unix-Timestamps aus deinen Datumsangaben: mktime
Anschliessend sortiere (siehe Array-Funktionen).
gruß,
wahsaga
Hallo wahsaga
Das mit den Timestamps hat soweit geklappt vielen Dank dafür.
Aber wie kann ich die verschiedenen Daten jetzt innerhalb meines Arrays sortieren. mit ksort (array) funzt das nicht.
Hast Du da noch mal nen kleinen Tipp
hi,
Aber wie kann ich die verschiedenen Daten jetzt innerhalb meines Arrays sortieren. mit ksort (array) funzt das nicht.
ksort macht laut Beschreibung _was_?
Hast Du da noch mal nen kleinen Tipp
Tipp: ksort ist nicht die einzige Array-Funktion.
gruß,
wahsaga
Aber wie kann ich die verschiedenen Daten jetzt innerhalb meines Arrays sortieren. mit ksort (array) funzt das nicht.
Lagere die Umwandlung in Timestamps in eine Vergleichsfunktion aus und verwende usort.
Siechfred
Hey Siechfred,
wenn ich das richtig verstanden habe,
muss ich bei der Variante zunächst über eine...
function cmp
{
... eine manuelle Sotierung vorgeben...
}
...die dann mit dem Befehl:...
usort ($meinarray, "cmp");
...für alle Array-Indexe ausgeführt wird.
Habe ich das so richtig verstanden?
Wenn ja:
Ich weiß ja nicht einmal, wie ich manuell ein Datum sortiere.
Gruß Paul
hi,
Ich weiß ja nicht einmal, wie ich manuell ein Datum sortiere.
Da hast du Glück gehabt - bei nur einem Datum gibt es nichts zu sortieren :-)
Du musst du die Daten in irgendein Format bringen, in dem sich überhaupt vergleichbar _sind_ - das könnte bspw. der Unix-Timestamp sein, oder auch das schon angesprochene Format YYYYMMDD oder YYYY-MM-DD.
Wenn du _diese_ direkt als Elemente in ein Array legst, kannst du das ganz simpel _nach seinen Werten_ sortieren lassen.
Siechfreds Vorschlag ist eine Alternative, wenn du die Original-Werte nicht umformatieren willst.
Das Manual zu usort erklärt doch recht anschaulich, wie's funktioniert. Deine Vergleichsfunktion bekommt immer zwei Array-Elemente übergeben, und muss dann bewerten, ob der erste "kleiner", "größer" oder "gleich" dem ersten ist.
Wenn die Daten nicht in einem sortierbaren Format vorliegen, kannst du es an dieser Stelle temporär für den Vergleich erstellen - bspw. mit dem schon erwähnten mktime als Unix-Timestamp, oder durch Umwandlung in bspw. YYYYMMDD, welches sich durch einfachen Zeichenkettenvergleich ebenfalls "sortieren" lässt.
gruß,
wahsaga
Also,
ich weiss nicht, ob hier jemand was damit anfangen kann, aber das ist meine Funktion, je nach Bedarf muss zum Beispiel die automatsiche Setzung einer 19 vor "YY" entfernt werden! lg
$geburtsdatum = preg_replace('/[\s]/','-',$geburtsdatum);
if ((preg_match('/(\d{1,2})--(.*)/A',$geburtsdatum,$treffer12) == 1 && $treffer12[4] == '') ||
(preg_match('/(\d{1,2})..(.*)/A',$geburtsdatum,$treffer12) == 1 && $treffer12[4] == '')) {
if (strlen($treffer12[1]) == 1) {$treffer12[1] = '0'.$treffer12[1];}
if (strlen($treffer12[2]) == 1) {$treffer12[2] = '0'.$treffer12[2];}
if (strlen($treffer12[3]) == 2) {$treffer12[3] = '19'.$treffer12[3];}
$geburtsdatum = $treffer12[3] . '-' . $treffer12[2] . '-' . $treffer12[1];
}
if(!(preg_match('/(\d{4}-\d{2}-\d{2})(.?)/A',$geburtsdatum,$treffer12) == 1 && $treffer12[2]== "")) {$fehlermeldung[12] = "<font color='red'>Geburtsdatum muss korrekt im Format YYYY-MM-DD eingegeben werden.</font><br />\n"; $input_valid = false;}
Das hab ich vergessen, ist die letztendliche Validation der Eingabe! Wenn sie einen Fehler zurückgibt, wars kein passendes Format. So kann man den User in ein einziges Eingabefeld schnell mit der Tastatur eintippen lassen, und die SELECT-Dropdowns vermeiden...(ich weiss aber nicht, ob das deine Absicht war!?)
Hi,
was ist genau dein Problem beim Sortieren? Geht es um die Datumsformate? Wenn ja, kann ich dir eine selbstgeschriebene Funktion Posten!
Diese erkennt die Formate YYYY-MM-DD, YYYY MM DD, (D)D-(M)M-YYYY, (D)D.(M)M.(YY)YY, und ersetzt sie durch YYYY-MM-DD
wobei im Falle einer Angabe YY das ganze durch 19(YY) ersetzt wird, würde also nur für Daten aus dem 20. Jahrhundert funktioniert, was für Geb.Daten in den meisten Fällen ausreichend ist. Natürlich könnte man sonst auch die Funktion abändern und auf einer Angabe YYYY bestehen!
Ich denke, das Format YYYY-MM-DD ist nämlich wichtig! evtl. gibt es PHP Funktionen, oder PEAR libs, die das gleiche direkt erledigen, aber damit kenne ich mich nicht aus.
Wenn du die Daten erstmal in YYYY-MM-DD hast, wird es aber problemlos möglich sein, sie zu sortieren (auch hierzu kenne ich keine Funktion, aber da gibts GANZ bestimmt eine. Es muss ja nur Zeichen für Zeichen durchgegangen werden! Also eine ganz unspezielle Textsortierungsfuntkion)
LG
Jens