Onkel Tom: Mehrdimensionales Array sortieren

Hallo zusammen,

ich hab ein Problem mit dem Sortieren von einem grösseren Array, vielleicht kann mir ja jemand helfen...?

Also, das Array sieht so aus:

Array (  
    [telefon] => Array (  
            [0] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] => festnetz  
                    [kontaktdaten] => +49.123.456789  
                )  
            [1] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] => mobile  
                    [kontaktdaten] => +49.123.456789  
                )  
            [2] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] => festnetz  
                    [kontaktdaten] => +49.123.456789  
                )  
            [3] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] => mobile  
                    [kontaktdaten] => +49.123.456789  
                )  
            [4] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] => festnetz  
                    [kontaktdaten] => +49.234.567890  
                )  
        )  
    [anschrift] => Array (  
            [0] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Koeln  
                )  
            [1] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Zuerich  
                )  
            [2] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Berlin  
                )  
            [3] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Bonn  
                )  
        )  
  
)

Und ich möchte nun die Daten in array('telefon') bzw. array('anschrift') wie folgt sortiert haben:

Array (  
    [telefon] => Array (  
            [0] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] => festnetz  
                    [kontaktdaten] => +49.123.456789  
                )  
            [1] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] => festnetz  
                    [kontaktdaten] => +49.234.567890  
                )  
            [2] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] => mobile  
                    [kontaktdaten] => +49.123.456789  
                )  
            [3] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] => festnetz  
                    [kontaktdaten] => +49.123.456789  
                )  
            [4] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] => mobile  
                    [kontaktdaten] => +49.123.456789  
                )  
        )  
    [anschrift] => Array (  
            [0] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Berlin  
                )  
            [1] => Array (  
                    [kontaktdatenTyp] => business  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Zuerich  
                )  
            [2] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Bonn  
                )  
            [3] => Array (  
                    [kontaktdatenTyp] => private  
                    [kontaktdatenKategorie] =>  
                    [kontaktdaten] => Koeln  
                )  
        )  
)

Also die einzelnen Arrays in telefon,anschrift zuerst nach kontaktdatenTyp, dann nach kontaktdatenKategorie und anschließend nach kontaktdaten. Mit usort habe ich es hinbekommen nach kontaktDatenTyp zu sortieren, aber nicht mehr... Hier mein bisheriger Code:

usort($array['telefon'], array("datenbankMySQLAdressbuch", "cmp"));  
  
public function cmp($a, $b) {  
  if (($a['kontaktdatenTyp'] == 'private') && ($b['kontaktdatenTyp'] == 'business')) {  
    return -1;  
  }  
  else if (($a['kontaktdatenTyp'] == 'business') && ($b['kontaktdatenTyp'] == 'private')) {  
  	return 1;  
  }  
  else {  
  	return 0;  
  }  
}

Hat irgendjemand eine Idee wie ich das realisieren kann? Bin für jeden Tip dankbar!

Gruss
Tom

  1. Hi!

    Und ich möchte nun die Daten in array('telefon') bzw. array('anschrift') wie folgt sortiert haben:
    Also die einzelnen Arrays in telefon,anschrift zuerst nach kontaktdatenTyp, dann nach kontaktdatenKategorie und anschließend nach kontaktdaten. Mit usort habe ich es hinbekommen nach kontaktDatenTyp zu sortieren, aber nicht mehr... Hier mein bisheriger Code:
    usort($array['telefon'], array("datenbankMySQLAdressbuch", "cmp"));

    Ist das Problem, dass du nicht weißt, wie du $array['anschrift'] sortieren lassen kannst oder dass du die Vergleichsfunktion so erweitern musst, dass bei Gleichheit das jeweils nächste Kriterium ausgewertet wird?

    Lo!

    1. Ist das Problem, dass du nicht weißt, wie du $array['anschrift'] sortieren lassen kannst oder dass du die Vergleichsfunktion so erweitern musst, dass bei Gleichheit das jeweils nächste Kriterium ausgewertet wird?

      Lo!

      Hallo Lo!,

      besten Dank für deine Antwort. Es gibt meiner Meinung nach zwei Mögliche Lösungen:
      1. Mein bisheriges usort/cmd erweitern
      2. Evtl eine std. PHP Methode die genau das macht, was ich will

      Leider komme ich bei beidem nicht weiter, gehe aber davon aus, das ich meine Fkt erweitern muss. Nur wie mach ich das? Mit der bisherigen cmd kann ich ja nur nach dem 1. Parameter auswerten...

      Um also auf deine Frage zu antworten, beides!

      Besten Dank und Gruss

      • Onkel Tom
      1. Hi!

        Ist das Problem, dass du nicht weißt, wie du $array['anschrift'] sortieren lassen kannst oder dass du die Vergleichsfunktion so erweitern musst, dass bei Gleichheit das jeweils nächste Kriterium ausgewertet wird?

        besten Dank für deine Antwort. Es gibt meiner Meinung nach zwei Mögliche Lösungen:

        1. Mein bisheriges usort/cmd erweitern

        Wo genau siehst du dabei die Schwierigkeit, den Zweig, der jetzt 0 zurückliefert, so zu erweitern, dass darin der Vergleich nach der Kategorie steht und darin wiederum bei Gleichheit die Kontaktdaten verglichen werden?

        1. Evtl eine std. PHP Methode die genau das macht, was ich will

        Solche speziellen PHP-Funktionen gibt es nicht (zumindest kenne ich keine).

        Lo!

        1. Servus,

          Oh man!!! Danke, manchmal hat man einfach ein Brett vorm Kopf...
          Mir war einfach nicht klar wo ich das einbauen muss...

          Thx, Onkle Tom!