• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[GELOEST] Array nach deutschem Datum sortieren

peternmb

Mitglied
Hallo,

mein Array hat jeweils 3 Werte und sieht etwas so aus:

01.03.2020,Herr,Maier
22.02.2020,Frau,Müller
usw.

ich möchte das Array nach dem Datum sortieren, das neuste Datum an erster Stelle
Mein Code funktioniert allerdings nicht, es passiert Nichts, die Ausgabe bleibt wie bisher:

Code:
    echo "<BR>und jetzt nach Datum sortiert:<BR><BR>";
    sort($array,konv_date2);
    for($i=0; $i < $files; $i++) {
        echo $array[$i][0].' - '.utf8_encode($array[$i][1]).' - '.utf8_encode($array[$i][2]);
        echo "<BR>";
    }
            
// Datum ins englische konvertieren (für Sortierung)
function konv_date2($datum)
{
   $jahr = substr($datum,6,4);
   $mon  = substr($datum,3,2);
   $tag  = substr($datum,0,2);
   $datneu = $jahr.''.$mon.''.$tag;
return $datneu;
}
 
Werbung:
Werbung:
Das ist jetzt nicht dein Ernst, oder?
sort
(PHP 4, PHP 5, PHP 7)
sort — Sortiert ein Array

Beschreibung
sort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) : bool

Diese Funktion sortiert ein Array. Die Elemente werden aufsteigend vom niedrigsten zum höchsten Wert sortiert.

Hinweis:
Wenn zwei Mitglieder als identisch verglichen werden, ist die relative Sortierung im sortierten Array nicht definiert.

Parameter-Liste
array
Das Eingabe-Array.
sort_flags
Der optionale zweite Parameter sort_flags kann mit folgenden Werten genutzt werden, um das Sortierverhalten zu ändern:

Sortiertypen-Flags:
  • SORT_REGULAR - vergleiche Einträge normal; Details sind dem Abschnitt über Vergleichsoperatoren zu entnehmen
  • SORT_NUMERIC - vergleiche Einträge numerisch
  • SORT_STRING - vergleiche Einträge als Strings
  • SORT_LOCALE_STRING - vergleiche Einträge als Strings, basierend auf den aktuellen Locale-Einstellungen. Es wird die System-Locale benutzt, die mittels setlocale() geändert werden kann.
  • SORT_NATURAL - vergleicht mittels eines Sortieralgorithmus für "natürlicher Reihenfolge" ähnlich zu natsort()
  • SORT_FLAG_CASE - kann kombiniert werden (bitweises OR) mit SORT_STRING oder SORT_NATURAL um Strings unabhängig von Groß- und Kleinschreibung zu sortieren

sort($array,konv_date2);

Was soll das konv_date2 an der Stelle?
 
sort() sortiert einen eindimensionalen Array. Du hast wohl einen merhdimensionalen, wenn ich das richtig verstehe. Dann benötigst du usort().


Beispiele würde man da zu Hauf finden:

Du musst allerdings zuerst noch durch Deinen Array durchgehen und das Datumsformat korrigieren. Die Funktion dazu hast du ja schon. Du kannst array_map() dazu verwenden => https://www.php.net/manual/de/function.array-map
Oder einfach foreach().

Einfacher wäre es jedoch schon nur ein "korrektes" ISO-Datumsformat zu speichern (YYYY-MM-DD) und dann bei der Ausgabe zu formatieren. Ich weiss halt nicht was Deine Datenquelle ist.
 
Eine von vielen Möglichkeiten, aber vielleicht die verständlichste Version für Anfänger.
PHP:
<?php
  $data = array("01.03.2020,Herr,Maier", "22.02.2020,Frau,Müller");
 
  $data = convert($data);
 
  sort($data);
 
  echo "<pre>";
  var_dump($data);
  die("</pre>");
            

function convert($data)
{
   $result = array();
  
   foreach ($data as $line)
   {
      $values = explode(",", $line);
      
      $date = date_create_from_format('d.m.Y', $values[0]);
      
      $values[0] = date_format($date, 'Y-m-d');
      
      $result[] = implode(",", $values);
  }

  return $result;
}
?>
 
Werbung:
Hallo,

vielen Dank für die Hilfestellung.

Die Funktion konv_date2 habe ich aus einem anderen Beitrag, den ich leider jetzt nicht mehr finde.
Diese Funktion konvertiert das deutsche Datum in ein sortierbares und sollte lt. diesem Beitrag funktionieren, ich vermute dann allerdings nur in einem einfachen array.

Der Code mit der convert-Funktion bringt mir allerdings kein Ergebnis, nur eine leere Ausgabe - ich habe meinen kompletten Code angehängt.

Ich lese 3-zeilige txt-Dateien aus einem Verzeichnis in ein array ein, die Ausgabe soll dann sortiert (neuste oben) möglich sein. Könnte ich in die convert-Funktion nicht auch gleich die utf8-Konvertierung der Werte 2 und 3 unterbringen, dann bräuchte ich das nicht immer bei der Ausgabe?

Sorry, ich bin bei PHP so ziemlich der absolute Anfänger und versuche das irgendwie so umzusetzen, wie ich es aus anderen Programmiersprachen gewohnt bin - vielleicht ist das auch hierbei manchmal kontraproduktiv :rolleyes:
PHP:
<?php
   $files = 0;                      // Zähler
   $path = scandir('./');     // Gibt den Inhalt des ganzen Verzeichnisses in einem Array wieder
   $array =[];                    // Array für Dateiinhalt
    
   foreach($path as $file){   // Wiederhole den Vorgang für jedes Element des Arrays "$path" 
    
   if (strtolower(substr($file,-4 ))== '.txt') {   // nur txt-Dateien
         $files++;                                             // Inkrementiert $files um 1
            $array[] = file($file);                        // Inhalt in array einlesen
          }
      }

    echo "es wurden $files txt-Dateien im Verzeichnis gefunden <BR><BR>";
    
    for($i=0; $i < $files; $i++) {
        echo $array[$i][0].' - '.utf8_encode($array[$i][1]).' - '.utf8_encode($array[$i][2]);
        echo "<BR>";
    }
    
    echo "<BR>und jetzt nach Datum sortiert:<BR>";
    
    $array = convert($array);
    sort($array);

    for($i=0; $i < $files; $i++) {
        echo $array[$i][0].' - '.utf8_encode($array[$i][1]).' - '.utf8_encode($array[$i][2]);
        echo "<BR>";
    }
    
function convert($data)
{
   $result = array();
 
   foreach ($data as $line)
   {
      $values = explode(",", $line);
      
      $date = date_create_from_format('d.m.Y', $values[0]);
      
      $values[0] = date_format($date, 'Y-m-d');
      
      $result[] = implode(",", $values);
  }

  return $result;
}

?>
 
Zuerst ging es um ein Array, jetzt geht es um mehrere Dateien in einem Verzeichnis, was kommt als nächstes?

Was sind das für Dateien? Wie sieht der Inhalt der Dateien aus? Warum keine Datenbank?
 
Zuerst ging es um ein Array, jetzt geht es um mehrere Dateien in einem Verzeichnis, was kommt als nächstes?
die Dateien sind doch bereits ins Array eingelesen - wo ist dann das Problem

Was sind das für Dateien? Wie sieht der Inhalt der Dateien aus? Warum keine Datenbank?
wie bereits oben erwähnt:
Ich lese 3-zeilige txt-Dateien aus einem Verzeichnis in ein array ein
Zeile 1 Datum, z.B.: 07.03.2020
Zeile 2 Veranstalter, z.B.: Mein Verein
Zeile 3 Veranstaltung, z.B.: mein Testturnier
Die text-Dateien werden von meinem Windows-Programm erstellt und per FTP hochgeladen.
Deshalb ist auch das Datum in diesem Format und ich benötige eine utf8-Konvertierung für Zeile 2 & 3.

Ich werde am Besten das ganze Projekt noch einmal in einem seperaten Thread posten, denn da habe ich noch das eine-oder-andere Problem zu lösen :cool: - vorrangig ist erst einmal die Sortierung damit ich weiterkomme.
 
Werbung:
Offenbar hat @jonas3344 Recht: Es handelt sich um ein zweidimensionales Array. Dann würde das Sortieren so funktionieren:
Code:
usort($array, function ($a, $b) {
    $date_a = konv_date2($a[0]);
    $date_b = konv_date2($b[0]);
    if ($date_a > $date_b) {
        return 1;
    } else if ($date_a < $date_b) {
        return -1;
    }
    return 0;
});
var_dump($array);
vielen Dank, so funktioniert es jetzt
 
Zurück
Oben