Andreas Vogt: assoziatives Array sortieren

Hallo,
ich habe ein assoz. Array mit folgender Struktur:

Array  
(  
    [Nummer] => Array  
        (  
            [id] =>  
            [name] =>  
            [link] =>  
            [group] =>  
            [type] =>  
            [avatar] => Array  
                (  
                    [name] =>  
                    [image] =>  
                    [href] =>  
                    [url] =>  
                )  
  
        )

Und möchte das Array nach dem Schlüssel name sortieren.
Dazu habe ich folgenden Code:

	$sname = array();  
	foreach ($array_list as $key => $row)  
	{  
	    $sname[$key] = $row['name'];  
	}  
	array_multisort($sname, SORT_ASC, $array_list);

Es werden aber nicht alle Werte sortiert, am Ende des Arrays habe ich welche die eigentlich weiter oben einsortiert werden müssten.

Wo ist mein Fehler?
Gruß Andreas

  1. Hello,

    Hallo,
    ich habe ein assoz. Array mit folgender Struktur:

    Array

    (
        [Nummer] => Array
            (
                [id] =>
                [name] =>
                [link] =>
                [group] =>
                [type] =>
                [avatar] => Array
                    (
                        [name] =>
                        [image] =>
                        [href] =>
                        [url] =>
                    )

    )

    
    >   
    > Und möchte das Array nach dem Schlüssel name sortieren.  
      
    Nach welchem [name]-Element möchtest Du denn sortieren?  
      
    [nummer][name]  
    oder  
    [nummer][avatar][name]  
      
      
    Wenn Du das Array umbauen würdest in der Form  
      
    ['id']['nummer']  
    ['name']['nummer']  
    ['link']['nummer']  
    ['group']['nummer']  
    ['type']['nummer']  
    ['avatar']['nummer']['name']  
    ['avatar']['nummer']['image']  
    ['avatar']['nummer']['href']  
    ['avatar']['nummer']['url']  
      
    Dann wäre das Sortieren nach id, name, link, group, etc. ganz einfach  
      
    Du müsstest Du nur z.B. mit dem Aufruf  
      
        $ok = natsort($\_\_array['name'])  
      
    die "Spalte" sortieren.  
    Da die einzelnen Elemente eines Datensatzes über die Nummer gebunden bleiben, kannst Du sie jederzeit wieder zusammensammeln zur Ausgabe.  
      
    <http://de2.php.net/manual/en/function.natsort.php>  
    oder  
    <http://de2.php.net/manual/en/function.natcasesort.php>  
      
    Die Nummer muss (kann auch nur) eineindeutig bleiben beim Ändern oder Einfügen von neuen Datensätzen!  
      
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://restaurant-zur-kleinen-kapelle.de>
    
    1. Hallo

      Nach welchem [name]-Element möchtest Du denn sortieren?

      nach [nummer][name]

      Wenn Du das Array umbauen würdest in der Form

      geht leider nicht, das Script ist Teil eines CMS (Simpleportal)
      Da müsste ich zu viel Code ändern.

      Gruß Andreas

      1. Hello,

        Wenn Du das Array umbauen würdest in der Form
        geht leider nicht, das Script ist Teil eines CMS (Simpleportal)
        Da müsste ich zu viel Code ändern.

        kommt darauf an, was mehr Aufwand macht...

        Alternativ ziehst Du einen Auszug aus dem Array:

        $_auszug = array();

        if (is_Array($_array))
        {
            foreach($_array as $nummer->$_record)
            {
                if (isset($_record['name']))
                {
                    $_auszug[$nummer] = $_record['name'];
                }
            }

        natsort($_auszug);
            ## nun liegt das Auszugsarray sortiert vor.
         }

        Jetzt musst Du das ursprüngliche Array nur noch nach der Reihenfolge des sortierten ausgeben. Dabei gilt hier der Spezialfall, dass alle Datensätze, die kein ['name'] enthalten haben, aus der Liste herausfallen.

        Hierfür ist array_keys() sinnvoll.
        http://de2.php.net/manual/en/function.array-keys.php

        Vorteil dieser Vorgehensweise ist, dass das Ursprungsarray in seiner Sortierung gar nicht angetastet wird und man sich auch mehrere Indexe aufbauen kann, nach denen ausgegeben werden kann.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://restaurant-zur-kleinen-kapelle.de
        1. Hallo,
          Problem gelöst,
          habe einfach die Query entsprechend sortiert.

          Gruß Andreas

          1. Hello,

            Problem gelöst,
            habe einfach die Query entsprechend sortiert.

            Entschuldige,

            aber jetzt muss ich lachen ;-)

            Wünsche Dir weiterhin derart positive Eingebungen und einen  Guten Rutsch ins Jahr 2014 n. Chr. Geb.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://restaurant-zur-kleinen-kapelle.de
  2. Tach!

    array_multisort($sname, SORT_ASC, $array_list);[/code]

    array_multisort() ist meist unbrauchbar, weil es nicht die üblichen Zeilenarrays (ein Eintrag pro Datensatz) sondern Spaltenarrays (ein Array für alle Nachnamen, eins für alle Vornamen, etc. ) haben möchte. Es ist besser, die Sortierung mit den u*sort()-Funktionen und einer selbst geschriebenen Vergleichsfunktion durchzuführen.

    dedlfix.

    1. Hello Dedlfix,

      array\_multisort($sname, SORT\_ASC, $array\_list);[/code]  
      

      array_multisort() ist meist unbrauchbar, weil es nicht die üblichen Zeilenarrays (ein Eintrag pro Datensatz) sondern Spaltenarrays (ein Array für alle Nachnamen, eins für alle Vornamen, etc. ) haben möchte. Es ist besser, die Sortierung mit den u*sort()-Funktionen und einer selbst geschriebenen Vergleichsfunktion durchzuführen.

      Ich halte es - wie hier schon lange bekannt - für sinnvoller, sich gar nicht erst in solch ein Datenchaos zu begeben, sondern die Datenstrukturen von Anfang an in einer besser verarbeitbaren Form aufzubauen!

      Da es sich in PHP in aller Regel imemr nur um temporäre Strukturen handelt (von Request zu Request), sollte man sein Gehirnschmalz eher darauf verwenden, schnell erzeugbare, schnell verarbeitbare und vor allem bei "Arrays" schnell sortierbare Strukturen zu benutzen. Außerdem benötigen die von mir immer wieder promoteten "Spaltenarrays" auch wesentlich weniger Speicherplatz, als die "satzorientierten". Das kann jeder nachprüfen und wird feststellen, dass es stimmt. Wenn der "assoziative Name" pro "Datensatzelement" gleich blebt und nur ein numerischer Index verwaltet werden muss, ist der Speicherplatzbedarf erheblich geringer, als wenn pro numerischem Index diverse assoziative Elemente gespeichert werden müssen.

      Da die Daten ohnehin über den gesamten Speicher verstreut gespeichert werden, ist es bezüglich der Zugriffszeit wiederrum nahezu egal, wie herum man sortiert, der numerische Zugriff auf ähnliche Elemente mag dabei aber noch etwas schneller sein. Das heißt jetzt aber

      [element][numerus] -> Wert

      und nicht etwa

      [numerus][element]...{Displacement} -> Wert

      denn wie Dir ja bekannt sein sollte, werden die Datenstrukturen ohnehin atomisiert abgelegt, und nicht etwa in geschlossener Form. Geht ja auch gar nicht, da niemand vorher weiß, wie lang ein String werden wird.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://restaurant-zur-kleinen-kapelle.de
      1. Tach!

        Ich halte es - wie hier schon lange bekannt - für sinnvoller, sich gar nicht erst in solch ein Datenchaos zu begeben, sondern die Datenstrukturen von Anfang an in einer besser verarbeitbaren Form aufzubauen!

        Erhöhter Speicher- und CPU-Bedarf sind Probleme, die sich meist durch einfaches Draufschmeißen von Hardware lösen lassen. Die meiste Zeit brauche ich meine Daten datensatzorientiert, zum Beispiel zum Weiterreichen an die verarbeitenden Funktionen/Methoden. Bei spaltenorientierter Verwaltung müsste ich erst Datensätze draus zu bauen oder sonst immer das ganze Array und die Position dazu übergeben. Das mag effizienter sein, aber da kein Mensch so programmiert, bleibt das doch eher unzweckmäßig. Die Sortierung ist auch besser im DBMS aufgehoben, da geht das mit passenden Indexen auch schneller.

        dedlfix.

        1. Hello,

          Erhöhter Speicher- und CPU-Bedarf sind Probleme, die sich meist durch einfaches Draufschmeißen von Hardware lösen lassen. Die meiste Zeit brauche ich meine Daten datensatzorientiert, zum Beispiel zum Weiterreichen an die verarbeitenden Funktionen/Methoden. Bei spaltenorientierter Verwaltung müsste ich erst Datensätze draus zu bauen oder sonst immer das ganze Array und die Position dazu übergeben.

          Die "Universalfunktionen" hierfür habe ich ja schon oft genug hier gepostet. Ma muss sie nur auf die Struktur ansetzen, den passenden Index nennen und schon fällt der Datensatz hinten raus. Zum Eintragen in die Struktur gibt es selbstverständlich auch eine Funktion...

          Das mag effizienter sein, aber da kein Mensch so programmiert, bleibt das doch eher unzweckmäßig. Die Sortierung ist auch besser im DBMS aufgehoben, da geht das mit passenden Indexen auch schneller.

          Wenn ein DBMS vorhanden ist, stimme ich Dir gerne zu.

          Der OP hatte uns das aber anfangs leider verschwiegen :-)

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://restaurant-zur-kleinen-kapelle.de