Steve: Multidemsionnales Array sortiern - nach mehren Spalten

Hallo zusammen,

ich habe folgendes Array:

$record = array (array("day" => 1, "month" => "April","year" => 2008),
array("day" => 3, "month" => "Januar","year" => 2006),
array("day" => 1, "month" => "Januar","year" => 2009));

Ich möchte nun das Array sortiert nach dem Datum ausgeben. Das Ergebnis sollte so ausehen:

3 Januar 2006
1 April 2008
1 Januar 2009

Ich habe schon x Funktionen getestet und komme leider nicht weiter. Kann mir bitte jemand helfen?

  1. echo $begrüßung;

    ich habe folgendes Array:

    Das ist also ein Array, dessen Elemente wiederum Arrays und damit komplexen Types sind.

    Ich möchte nun das Array sortiert nach dem Datum ausgeben.

    Für Arrays mit einfachen (skalaren) Werte stellt PHP Sortierfunktionen bereit. Für komplexe Werte musst du dir selbst eine Vergleichsfunktion schreiben, und kannst dann die u*sort()-Array-Funktionen verwenden.

    Alternativ gibt es noch array_multisort(), doch das erfordert eine andere Struktur der Daten, ein so genanntes Spalten-Array. Du hast jedoch ein Zeilen-Array vorliegen.

    echo "$verabschiedung $name";

    1. Hallo echo "$verabschiedung $name",

      danke dir.

      "Alternativ gibt es noch array_multisort(), doch das erfordert eine andere Struktur der Daten, ein so genanntes Spalten-Array. Du hast jedoch ein Zeilen-Array vorliegen."

      Damit habe ich schon getestet, indem ich alle Elemente einer Zeile in einem String abgespeichert habe und jeweils einen eindimensionalen Array zugewiesen haben.

      Leider ist aber das Ergebnis falsch ;-)

      Ich komme einfach nicht weiter.

      1. Moin!

        "Alternativ gibt es noch array_multisort(), doch das erfordert eine andere Struktur der Daten, ein so genanntes Spalten-Array. Du hast jedoch ein Zeilen-Array vorliegen."

        Damit habe ich schon getestet, indem ich alle Elemente einer Zeile in einem String abgespeichert habe und jeweils einen eindimensionalen Array zugewiesen haben.

        Leider ist aber das Ergebnis falsch ;-)

        Richtig, hat dedlfix dir ja auch gesagt, dass array_multisort dir nicht weiterhilft.

        Nutze usort() und definiere dir eine passende Vergleichsfunktion. Du kriegst die Arrayelemente des äußeren Arrays übergeben. Typischerweise heißen die beiden Variablen, denen zwei Werte zum Vergleich übergeben werden, $a und $b, was bedeutet, dass du in der definierten Sortierfunktion in $a und $b jeweils eines der inneren Arrays mit deinem Datum drin stehen hast.

        Deine Funktion muß nun nacheinander Jahr, Monat und Tag vergleichen und nach jedem Vergleich entscheiden, ob dadurch schon eine Reihenfolge gefolgert werden kann. Nur bei gleichem Jahr muß der Monat verglichen werden. Nur bei gleichem Monat muß der Tag verglichen werden. Nur bei gleichem Tag gibst du eine 0 zurück, ansonsten eine 1 oder eine -1, je nachdem, ob gilt $a > $b oder $b > $a.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
      2. echo $begrüßung;

        "Alternativ gibt es noch array_multisort(), doch das erfordert eine andere Struktur der Daten, ein so genanntes Spalten-Array. Du hast jedoch ein Zeilen-Array vorliegen."
        Damit habe ich schon getestet, indem ich alle Elemente einer Zeile in einem String abgespeichert habe und jeweils einen eindimensionalen Array zugewiesen haben.
        Leider ist aber das Ergebnis falsch ;-)

        Wenn du wirklich array_multisort() statt der einfacheren Variante mit der benutzerdefinierten Vergleichsfunktion verwenden möchtest, muss dein Array komplett umsortiert werden. Das lohnt sich meist nur dann, wenn man komplett die Philosophie wechselt und mit Spalten-Arrays statt Zeilen-Arrays arbeitet. Nur mal eben zum Sortieren, das Array umzubauen und dann wieder zurück ist zu aufwendig. Außerdem, das hatte ich bei meiner ersten Antwort nicht weiter beachtet, benötigst du dafür vergleichbare Daten. Für Jahr und Tag ist das aufgrund der Zahlenwerte gut möglich, aber beim Monatsnamen hast du schon mal schlechte Karten. Hier hilft sowieso nur eine eigene Vergleichsfunktion.

        Die Monatsnummern kannst du übrigens so erhalten:

        $monate = array(1 => 'Januar', 'Februar', 'März', ...'Dezember');
        $monatsnummer = array_search($monate, $monatsname);
        Wenn $monatsnummer === false ist, war der Monatsname falsch geschrieben.

        echo "$verabschiedung $name";

  2. gudn tach!

    ich habe folgendes Array:
    $record = array (array("day" => 1, "month" => "April","year" => 2008),
    array("day" => 3, "month" => "Januar","year" => 2006),
    array("day" => 1, "month" => "Januar","year" => 2009));

    evtl. eine unguenstige datenstruktur (ist aber auch zum grossen teil geschmackssache). mit einer anderen datenstruktur wuerde sortieren z.b. leichter fallen:

    foreach($record as &$value){  
     $value['month'] = strtr(substr($value['month'],0,3), 'ikzä', 'ycca');  
     $value = date('Y-m-d', strtotime(join(' ',$value)));  
     echo $value,"\n";  
    }  
    sort($record);  
    print_r($record);
    

    Ich möchte nun das Array sortiert nach dem Datum ausgeben. Das Ergebnis sollte so ausehen:

    3 Januar 2006
    1 April 2008
    1 Januar 2009

    setlocale(LC_TIME, 'de_DE');  
    foreach($record as $value){  
     echo strftime('%e %B %Y'."\n", strtotime($value));  
    }
    

    prost
    seth