Array nach mehreren Feldern sortieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array nach mehreren Feldern sortieren

    Hallo,

    ich möchte ein Array nach mehreren Feldern sortieren. Hier ist ein Beispiel mit meinem Lösungsversuch:

    $kunde[0] = array("vorname"=>"Hans", "nachname"=>"Maier", "strasse"=>"Nussweg 12", "ort"=>"München");
    $kunde[1] = array("vorname"=>"Manuela", "nachname"=>"Schmidt", "strasse"=>"Bahnhofstr. 34","ort"=>"Frankfurt");
    $kunde[2] = array("vorname"=>"Klaus", "nachname"=>"Michaelis","strasse"=>"Mühlweg 8", "ort"=>"Hamburg");
    $kunde[3] = array("vorname"=>"Sabine", "nachname"=>"Jabst", "strasse"=>"Flurweg 8", "ort"=>"Dresden");
    $kunde[4] = array("vorname"=>"Gerhard", "nachname"=>"Blum", "strasse"=>"Wiesenweg 77", "ort"=>"Berlin");
    $kunde[5] = array("vorname"=>"Marion", "nachname"=>"Michaelis","strasse"=>"Ahornweg 12", "ort"=>"Hamburg");

    Function sortiere_kunde(&$a)
    {
    Function cmp_array_nachname ($a, $b)
    {
    return(strcmp($a["nachname"], $b["nachname"]));
    }
    usort($a, "cmp_array_nachname");
    }

    sortiere_kunde($kunde);

    echo "kunde: ";

    echo "<pre>";
    print_r( $kunde );
    echo "</pre>";

    Doch leider funktioniert das nur nach einem Feld. Wie kann ich jetzt nach einem zweiten oder dritten Feld sortieren?
    Also z.B. Name, Ort, Strasse...

    Gibt es dafür eventuell eine fertige Funktion oder Klasse? Danke

    Gruß Marcel

  • #2
    Wie soll das denn gehen nach mehreren Feldern zu sortieren? Du sortierst zuerst nach Vorname. Dann nach Nachname. Damit ist aber die Sortierung nach Vorname im Eimer.
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Moin,
      Handbuch -> uasort ( array &array, callback cmp_function ) und eine passende callback Funktion schreiben
      Die Macht der Presse spüren vor allem die Weintrauben.

      Kommentar


      • #4
        Hallo!

        Original geschrieben von jahlives
        Wie soll das denn gehen nach mehreren Feldern zu sortieren? Du sortierst zuerst nach Vorname. Dann nach Nachname. Damit ist aber die Sortierung nach Vorname im Eimer.
        Das glaube ich jetzt aber nicht wirklich!

        Beispiel mit den obigen Daten:

        Hans, Maier, Nussweg 12, München
        Manuela, Schmidt, Bahnhofstr. 34, Frankfurt
        Marion, Michaelis, Ahornweg 12, Hamburg
        Klaus, Michaelis, Mühlweg 8, Hamburg
        Sabine, Jabst, Flurweg 8, Dresden
        Gerhard, Blum, Wiesenweg 77, Berlin

        So sollte die Formatierung aussehen.
        Die Marion Michaelis kommt vor dem Klaus Michaelis weil sie im Ahornweg wohnt und nicht im Mühlweg.

        Kommentar


        • #5
          Crossposting!!!!

          http://www.php.de/php-profis/1539-ar...sortieren.html
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          http://www.lit-web.de

          Kommentar


          • #6
            Danke für deine Antwort wshbg!

            Original geschrieben von wshbg
            Moin,
            Handbuch -> uasort ( array &array, callback cmp_function ) und eine passende callback Funktion schreiben
            Aber das ist doch eine alltägliche Anforderung, gibt es da keine fertige Lösung?

            Marcel

            Kommentar


            • #7
              Original geschrieben von litterauspirna
              Crossposting!!!!

              http://www.php.de/php-profis/1539-ar...sortieren.html
              Schau es Dir doch an, welche Antworten man bekommt.

              Kommentar


              • #8
                Trotzdem macht man das nicht!

                Du hast 21.12Uhr da gepostet und nun schon 21.17Uhr hier?

                Ein bisschen Geduld solltest du schon mitbringen wenn du schon Hilfe anderer in Anspruch nehmen willst!!!
                Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                http://www.lit-web.de

                Kommentar


                • #9
                  Lies mal im Manual zu usort. Im Fall wo die Namen übereinstimmen ergibt strcmp() eine 0. Also musst du in diesem Fall einen strcmp() auf das nächste Feld machen
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    http://de2.php.net/manual/de/functio...-multisort.php
                    "Nicht jeder Mensch kann und soll Programmieren[...]".

                    Kommentar


                    • #11
                      Aber das ist doch eine alltägliche Anforderung, gibt es da keine fertige Lösung?
                      Hier ist eine alltägliche (allgemeine) Lösung für den Vergleich:
                      PHP-Code:
                      function cmp ($a,$b) {
                          if (
                      $a[0] > $b[0]) {
                              
                      $sort = -1;
                          } else {
                              if (
                      $a[0] == $b[0]) {
                                  if (
                      $a[1] > $b[1]) {
                                      
                      $sort = -1;
                                  } else {
                                      if (
                      $a[1] == $b[1]) {
                                          if (
                      $a[2] > $b[2]) {
                                              
                      $sort = -1;
                                          } else {
                                              
                      $sort 1// oder weiter verschachteln
                                          
                      }
                                      } else {
                                          
                      $sort 1;
                                      }
                                  }
                              } else {
                                  
                      $sort 1;
                              }
                          }
                          return 
                      $sort;

                      Wilfried
                      Die Macht der Presse spüren vor allem die Weintrauben.

                      Kommentar


                      • #12
                        Original geschrieben von wshbg
                        Hier ist eine alltägliche (allgemeine) Lösung für den Vergleich:
                        Die hat einfach den Nachteil, dass sie einerseits in der Tiefe begrenzt ist, und andererseits nur Arrays mit nummerischen Indizes behandeln kann. Hier eine rekursive Version, die zuerst die assoziativen in nummerische Indizes umwandelt:
                        PHP-Code:
                        function ar_cmp($a_str,$b_str) {
                            
                        $i 0;
                            foreach (
                        $a_str as $ele){
                                
                        $a[$i] = $ele;
                                
                        $i ++;
                            }
                            
                        $i 0;
                            foreach (
                        $b_str as $ele){
                                
                        $b[$i] = $ele;
                                
                        $i ++;
                            }
                            if (
                        $a[0] == $b[0]){
                                if (isset(
                        $a[1])){
                                    
                        array_shift($a);
                                    
                        array_shift($b);
                                    return(
                        ar_cmp($a$b1));
                                }
                                else{
                                    return 
                        0;
                                }
                            }
                            else{
                                return 
                        strcmp($a[0], $b[0]);
                            }

                        Sehr effizient ist die allerings vermutlich nicht
                        Gruss
                        H2O

                        Kommentar

                        Lädt...
                        X