Array-Sortierproblem

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

  • Array-Sortierproblem

    Hallo,

    ich habe habe folgendes Array:

    PHP-Code:
    Array
    (
         [
    rote Gruppe] => Array
             (
                 [
    u264] => Hans Meier
                 
    [u265] => Thomas Meier
                 
    [u353] => Hans Mustermann
                 
    [u354] => Jochen Adler
                 
    [u355] => Sandra Schmidt
                 
    [u356] => Anna Zuse
                 
    [u360] => Aurelius Watter
             
    )

         [
    blaue Gruppe] => Array
             (
                 [
    u101] => Thomas Glass
                 
    [u102] => Simone Coch
                 
    [u126] => Eberhardt Fernandez
                 
    [u139] => Peter Kammer
                 
    [u140] => Reiner Unruh
                 
    [u141] => Sachin Koguloglu
                 
    [u363] => Helmut Seiler
                 
    [u364] => Ute Schleger
             
    )




    Das echte Array im Skript ist wesentlich grösser... Ok, wie man sieht sind User-IDs als Array-Keys vergeben und als jeweils ein String der vollständige Name des Nutzers als Werte.
    Ich brauche nun eine Möglichkeit, das Array nach den Nachnamen zu sortieren.
    - ich will also z.b. alle User-IDs und Namen der blauen Gruppe nach den Nachnamen sortiert ausgeben.
    - der Einfachheit halber nehmen wir an, dass alle Namen aus einem Vor- und einem Nachnamen bestehen. Ich könnte also den Namensstring mit explode in ein array unwandeln, umdrehen (array_reverse) und dann mit implode wieder zu einem String umwandeln. Danach dann die Sortierung.

    Meine Fragen:
    - wie kann ich die "Umstellung" des Namens durchführen?
    - wie kann ich dann die Teilarrays sortieren?

    Bin mit den vielen Arrayfunktionen nicht so sehr vertraut...

    M.

  • #2
    Vielleicht suchst du uasort()

    Kommentar


    • #3
      Original geschrieben von Manni_the_Dark
      Vielleicht suchst du uasort()
      Hm, ja mag sein, dass ich mit uasort() zum Ziel komme. Aber ich blicke noch nicht so genau durch, wie diese Funktion auf mein Problem anzuwenden ist.

      Hab mal etwas weitergemacht. Aber zu einer Lösung bin ich noch nicht gekommen. So funktioniert es zum Beispiel nicht:

      PHP-Code:
      // $alles = Array mit allen Gruppen und in jeder Gruppe ein Array mit User-IDs und Namen

      foreach ($alles as $gruppenname => $UIDNamenArray) {

          foreach(
      $UIDNamenArray as $UID => $Namen){
              
      $rev=implode(' 'array_reverse(explode(' '$Namen)));
              
      $UIDNamenArray [$UID ]=$rev;
          }  
          
      asort($UIDNamenArray); 

      Was ist falsch?

      Kommentar


      • #4
        als ansatz:
        PHP-Code:
        function cmp($a$b
        {
            
        $n1 explode(" "$a); $n1 $n1[1];
            
        $n2 explode(" "$b); $n2 $n2[1];
            
            return 
        strcasecmp($n1,$n2);
        }

        uasort($a["rote Gruppe"], "cmp"); 
        musst das jetzt nur noch für jede gruppe automatisieren.

        Kommentar


        • #5
          Original geschrieben von penizillin
          als ansatz:
          PHP-Code:
          function cmp($a$b
          {
              
          $n1 explode(" "$a); $n1 $n1[1];
              
          $n2 explode(" "$b); $n2 $n2[1];
              
              return 
          strcasecmp($n1,$n2);
          }

          uasort($a["rote Gruppe"], "cmp"); 
          musst das jetzt nur noch für jede gruppe automatisieren.
          Genau das ist ja mein Problem. Ich komme einfach nicht so ganz dahinter, wie ich mit Arrays in Arrays umgehe. Komme da immer ganz durcheinander mit denKeys und Values... :-(

          Was muss ich denn machen, um mein oben genanntes Array zu bearbeiten? Ich muss das dynamisch machen, weil ich in der Realität mehr als die zwei Gruppenarrays habe. Mal habe ich zwei Farben, mal zehn, mal 15...

          Brauche ich ne foreach-Schleife um die von dir genannte Funktion? Und wie mache ich das?

          Kommentar


          • #6
            genau richtig.
            foreach schleife über dein array und (wichtig!) elemente by reference ansprechen (sonst wird nichts sortiert).

            Kommentar


            • #7
              Original geschrieben von penizillin
              genau richtig.
              foreach schleife über dein array und (wichtig!) elemente by reference ansprechen (sonst wird nichts sortiert).
              Referenzen kenne ich überhaupt nicht. Wie funktioniert das? Hilfe!! :-o
              Kannst du mir die foreach-Schleife mal eben um deine Funktion drumrum bauen? Danke!!

              Kommentar


              • #8
                nein, fertiglösungen gibt es gegen bezahlung.
                wenn du es mal selbst versuchen würdest, könnte man dir helfen.

                http://de3.php.net/manual/en/language.references.php

                Kommentar


                • #9
                  Du musst einfach dein Array mit einer foreach-Schleife durchlaufen.
                  Code:
                  foreach( $myArray as $key => $value ) { .. }
                  Zwischen den geschweiften Klammern rufst du die uasort Funktion auf, der erste Parameter ist $myArray[ $key ]. Da du Sortierung auch in diesem Array haben möchtest, muss das ganze nicht als Kopie sondern als Referenz übergeben werden, das erreichst du, indem du $myArray[ $key ] ein kaufmännisches und voran setzt ([COLOR=red]&[/COLOR]$myArray[ $key ]). Das ergibt dann:
                  Code:
                  foreach( $myArray as $key => $value )
                  {
                    uasort([B][COLOR=red]&[/COLOR]$myArray[ $key ][/B], 'cmp');
                  }

                  Kommentar


                  • #10
                    Original geschrieben von penizillin
                    als ansatz:
                    PHP-Code:
                    function cmp($a$b
                    {
                        
                    $n1 explode(" "$a); $n1 $n1[1];
                        
                    $n2 explode(" "$b); $n2 $n2[1];
                        
                        return 
                    strcasecmp($n1,$n2);
                    }

                    uasort($a["rote Gruppe"], "cmp"); 
                    musst das jetzt nur noch für jede gruppe automatisieren.
                    Wow, vielen Dank!! Es funktioniert super. Sorry, weil ich so viel nachgefragt habe. Hab es eben mal ausprobiert und konnte es ganz einfach auch dynamisch machen.

                    Kommentar

                    Lädt...
                    X