Sortieren

  • PHP

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von 3daycliff.

    Hallo Zusammen

    Ich habe ein Array mit Folgenden Dateinamen:

    09.03.2014
    16.02.2014
    02.03.2014 - Berg
    16.03.2014 - Anfang
    23.02.2014

    Wenn ich dieses mit der Funktion sort() sortiere erhalte ich dies:

    02.03.2014 - Berg
    09.03.2014
    16.02.2014
    16.03.2014 - Anfang
    23.02.2014

    Ich möchte jedoch diese Ausgabe (nach Datum sortiert):

    16.03.2014 - Anfang
    09.03.2014
    02.03.2014 - Berg
    23.02.2014
    16.02.2014

    Könnt ihr mir da weiter helfen?

    Vielen Dank!
    Ich würde es ja so machen .. :)
    Edit: Hoppla nicht gesehen dass es PHP ist :)

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim s As New List(Of String) From {"09.03.2014",
    5. "16.02.2014",
    6. "02.03.2014 - Berg",
    7. "16.03.2014 - Anfang",
    8. "23.02.2014"}
    9. Dim comparer As New DateComparer()
    10. s.Sort(comparer)
    11. End Sub
    12. Public Class DateComparer
    13. Implements IComparer(Of String)
    14. Public r As New System.Text.RegularExpressions.Regex("\d+\.\d+\.\d+")
    15. Public Function Compare1(x As String, y As String) As Integer Implements IComparer(Of String).Compare
    16. Dim x1 As DateTime = DateTime.Parse(r.Match(x).Value)
    17. Dim x2 As DateTime = DateTime.Parse(r.Match(y).Value)
    18. Return x2.CompareTo(x1)
    19. End Function
    20. End Class
    21. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMiy“ ()

    Sortieren basiert im Wesentlichen immer auf dem Vergleichen zweier Objekten. Bei usort gibst du eine Funktion an, die entscheidet, wie zwei Objekte (in deinem Fall Strings; Dateinamen) angeordnet werden sollen, also ob das erste "größer" (weiter vorne in der Liste) oder "kleiner" (weiter hinten in der Liste) als das zweite ist oder halt gleich.

    Dafür muss man nicht extra eine Funktion "cmp" definieren, sofern man PHP >= 5.3 nutzt.

    Hier mal Quick & Dirty und ungetestet:

    PHP-Quellcode

    1. usort($ar, function($a, $b) {
    2. $dateA = DateTime::createFromFormat("d.m.Y", substr($a, 0, 10));
    3. $dateB = DateTime::createFromFormat("d.m.Y", substr($b, 0, 10));
    4. if($dateA > $dateB) {
    5. return 1;
    6. }
    7. elseif($dateA < $dateB) {
    8. return -1;
    9. }
    10. else {
    11. // Name nach Datum vergleichen
    12. return 0;
    13. }
    14. });
    Das hat super geklappt.
    Wie gesagt, Quick&Dirty; da gibt es noch Verbesserungspotential.

    Jedoch verstehe ich nicht welche Werte $a und $b zugewiesen werden.Werden da einfach immer 2 Einträge aus dem Array genommen?
    Ähm... ja! ; )
    Wie sortierst du dann "per Hand"? Im Endeffekt vergleichst du auch immer zwei Werte, schaust welcher kleiner/größer ist und veränderst dann ggf. die Position von einem. Viel mehr macht PHP hier auch nicht. Welcher Eintrag mit welchem verglichen wird, hängt von der konkreten Implementierung ab. Aktuell wird glaube ich eine Variante von Quicksort verwendet.