Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] zweidimensionales Array sortieren (mal wieder..)

Einklappen

Neue Werbung 2019

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

  • [Erledigt] zweidimensionales Array sortieren (mal wieder..)

    Hallo,

    über google habe ich ja schon eine ganze Menge Threads zu diesem Thema gefunden, allerdings nicht genau DAS, was ich suche. Ich hoffe mal, dass ich mich bei der Hitze nicht einfach nur zu blöd anstelle...

    Also, nun ins Detail:
    Ich habe ein zweidimensionales Array $two_dim['assoc'][$i], d. h. die erste Dimesion ist assoziativ (hat die Länge 3) und die zweite durchnummeriert bis 100+. Nun habe ich die Funktionen usort() (anscheinend für mich uninteressant) und array_multisort() gefunden.


    $two_d|--0--|--1--|--2--
    ===============
    id------|--1--|--14-|--4--
    name--|Hans|Adi--|Ela--
    points-|--20-|--10-|--15


    Wenn ich nun array_multisort($two_dim['points'],SORT_DESC) aufrufe, dann sortiert er zwar diese Punktzahlen, behält die Verknüpfungen bei Namen und ID aber nicht bei.
    Welcher Kniff erspart mir große Verzweiflung?

    Grüße an alle


  • #2
    Ich habs zwar noch nie gemacht, aber ich könnte mir vorstellen das das so geht:

    PHP-Code:
    $two_dim ksort(array_map("ksort",$two_dim)); 

    Kommentar


    • #3
      Hallo diarrhoe (eigenartiger Nickname übrigens...)

      Die einfachste Methode wäre, so die Daten aus ner DB kommen, sie dort zu sortieren. PHP sortiert numerische Indizies i.A. nicht Schlüssel-beibehaltend. Die unschöne zweite Variante wäre deshalb, String Schlüssel zu verwenden, indem Du bspw. ein Präfix verwendest.

      Ob cycap's Variante funktioniert bleibt auszuprobieren, denn ob ksort numerische Indexe beibehält...
      [edit] Ähhhm, Quatsch. Natürlich nein, weil cycap wohl zumindest asort meinte....
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        [edit]
        Ups, sicher meinte ich asort

        Zitat von cycap Beitrag anzeigen
        Ich habs zwar noch nie gemacht, aber ich könnte mir vorstellen das das so geht:

        PHP-Code:
        $two_dim asort(array_map("asort",$two_dim)); // korrigiert nach Hinweis von nikosch 

        Kommentar


        • #5
          Die Zuweisung ist auch falsch. Die sort Funktionen verwenden alle Referenzen...

          Ganz klappts nicht. Vgl.

          PHP-Code:
          <pre><?
          $two_dim['a'][1] = 'a1';
          $two_dim['c'][1] = 'c1';
          $two_dim['a'][11] = 'a11';
          $two_dim['b'][8] = 'b8';
          $two_dim['a'][7] = 'a7';
          asort(array_map("asort",$two_dim));  

          var_dump($two_dim );

          /*

          array(3) {
            ["a"]=>
            array(3) {
              [1]=>
              string(2) "a1"
              [11]=>
              string(3) "a11"
              [7]=>
              string(2) "a7"
            }
            ["c"]=>
            array(1) {
              [1]=>
              string(2) "c1"
            }
            ["b"]=>
            array(1) {
              [8]=>
              string(2) "b8"
            }
          }

          */
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Schande über mich aber die Idee war wenigstens richtig

            Kommentar


            • #7
              Naja, nicht wirklich. Wenn man die Arbeitsweise überlegt kann das auch gar nicht klappen. Vom tiefsten Zweig nach außen bekommst Du mit normalen Funktionen allenfalls die 'Blätter' eines Zweiges sortiert, aber nicht die gesamte Menge aller Einträge. Das ist kein triviales Problem, schon gar nicht wenn man bedenkt, dass ja auch mehrere Verschachtelungstiefen in einem Array bestehen könnten.
              Vielleicht könnte man die Struktur des Arrays beibehalten, statt der Werte auf den Index eines zweiten, numerischen Arrays verweisen und jenes dann schlüsselkonsistent sortieren. Aber wie gesagt, das beste wäre über die Datenbank. Mal sehen was der OT dazu sagt....
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Okay, jetzt habe ich eure Beiträge durchgearbeitet und die php.net-Doku zu den einzelnen Funktionen gelesen (mit dem Begriff der Callback-Funktionen hab ich noch einige Schwierigkeiten, aber das ist ein anderes Thema).

                Die Sortierung funktioniert so leider nicht - aber das müsste ja eigentlich auch klar sein, denn es wird noch nirgendwo angegeben, *wonach* sortiert werden soll. Für weitere Tipps bin ich natürlich sehr dankbar, ansonsten lerne ich jetzt mal die Doku weiter auswendig

                Mit einer Datenbank wäre das alles soo schön einfach, aber das ist leider gerade nicht möglich..

                Ebenfalls probiert:
                Code:
                asort(array_map("asort",$two_dim['points']));
                aber das bricht mit
                Code:
                asort() expects parameter 1 to be array..
                ab, wobei $two_dim['points'] doch eigentlich auch ein Array ist oder..?

                Kommentar


                • #9
                  Kommt darauf an, was drinsteht. Der Fehler bezieht sich wohl auch eher auf das andere asort, weil dieses eine Referenz erwartet, keinen Ausdruck.
                  Aber wie gesagt - ich denke nicht dass es eine Triviallösung gibt, die einfach ein, zwei Sort Statements verbindet. Mal über die Sache mit dem Index-Array nachgedacht?
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Ich merke gerade, ich glaube, ich habe die Ausgangsfrage doch falsch interpretiert. Kannst Du das nochmal präzisieren: Im Endeffekt willst Du immer nur alle Werte eines einem assoz. Schlüssel zugeordneten Arrays sortieren und dabei die num. Indexe behalten oder?
                    Im einfachsten Falle wäre das also doch die obige Lösung:
                    PHP-Code:
                    asort(array_map("asort",$two_dim)); 
                    Wenn nicht mußt Du mal eine Vorher/Nachher Struktur zeigen, wie dasaussehen soll.

                    Btw: PHP: Pseudo-types and variables used in this documentation - Manual
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Okay, hier mal eine Vorher-/Nachher-Gegenüberstellung:

                      Vorher:

                      Code:
                      $two_d--|--0--|--1--|--2--
                      ===================
                      id------|--1--|--14-|--4--
                      name----|Hans-|Adi--|Ela--
                      points--|--20-|--10-|--15
                      Nachher:

                      Code:
                      $two_d--|--0--|--1--|--2--
                      ===================
                      id------|--1--|--4--|-14--
                      name----|Hans-|Ela--|Adi--
                      points--|--20-|--15-|--10
                      Bei dem Index-Array weiß ich gerade ehrlich gesagt gar nicht, was damit gemeint ist.

                      Kommentar


                      • #12
                        Also mit andern Worten, du willst nicht den Array auf der obersten Stufe sortieren, sondern die Arrays der zweiten Stufe nach Punkten. Ich glaube nicht, dass es dafür eine Funktion gibt. Der folgende Code macht das indem die Indizes vertauscht werden:
                        PHP-Code:
                        $n_ar $two_d['points'];
                        sort($n_ar);

                        for (
                        $i 0;$i count($n_ar);$i ++){
                            
                        $idx array_search($n_ar[$i], $x['points']);
                            
                        $x_neu['id'][$i] = $x['id'][$idx];
                            
                        $x_neu['name'][$i] = $x['name'][$idx];
                            
                        $x_neu['points'][$i] = $x['points'][$idx];
                        }

                        $two_d $x_neu
                        Die Reihenfolge umzukehren wirst du schon noch schaffen.
                        Gruss
                        L

                        Kommentar


                        • #13
                          @dia: Also das ist ja mal nen tolles Beispiel, entweder du hast jetzt nach id vorwärts oder nach name rückwärts oder nach punkten rückwärts sortiert... oh man

                          Kommentar


                          • #14
                            Sorry, bei Deiner Tabellendarstellung bekomme ich Kopfaua. Quasi so, ja?
                            Code:
                                [id] => Array
                                    (
                                        [0] => 1
                                        [1] => 14
                                        [2] => 4
                                    )
                            
                                [name] => Array
                                    (
                                        [0] => Hans
                                        [1] => Adi
                                        [2] => Ela
                                    )
                            
                                [points] => Array
                                    (
                                        [0] => 20
                                        [1] => 10
                                        [2] => 15
                                    )
                            Code:
                                [id] => Array
                                    (
                                        [0] => 1
                                        [2] => 4
                                        [1] => 14
                                    )
                            
                                [name] => Array
                                    (
                                        [0] => Hans
                                        [2] => Ela
                                        [1] => Adi
                                    )
                            
                                [points] => Array
                                    (
                                        [0] => 20
                                        [2] => 15
                                        [1] => 10
                                    )
                            Darf man fragen was das soll? Du willst dann später bspw. $two_d[id] mit for durchlaufen und über den numerischen Index gleichzeitig die Zweige points und name ansprechen? Etwa so? Ich finde es irgendwie Quatsch, die obige Struktur zu sortieren.

                            Mit Index meinte ich etwa das:
                            - Kopiere $two_d['id']
                            - Sortiere das neue Index-Array nach Werten, schlüsselkonsistent über asort
                            - Um auf $two_d über fortlaufende Indizies zuzugreifen, durchläufst Du fortan das Index Array (bspw. mit foreach) und nutzt den anfallenden Schlüssel für den Zugriff auf die Zweige von $two_d

                            PHP-Code:
                            $aIndex $two_d['id'];
                            asort ($aIndex);
                            foreach (
                            $aIndex as $iKey => $temp)
                              {
                              echo 
                            $two_d['points'][$iKey];
                              echo 
                            $two_d['name'][$iKey];
                              } 
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              @ cycap: Sorry, das ist mir gar nicht aufgefallen. Die Sortierung war anhand der Punktzahl angedacht.

                              @nikosch: Ich persönlich komme in solchen Fällen deutlich besser mit der tabellenförmigen Darstellung klar, aber genau so war das angedacht.
                              Ich hatte dafür Methoden bekommen, die das ganze in der richtigen Reihenfolge (Punkte absteigend) ausgeben sollten.

                              @all: Nun habe ich mich das WE damit beschäftigt, einen großen Teil des Codes, den ich bekam, neuzuschreiben, um vernünftig mit MySQL arbeiten zu können, da mir das hier doch sehr kompliziert wurde und ich das Gefühl hatte, dass ich mit dem Code häufiger in solche Situationen käme.

                              Vielen Dank für eure Mühen und Hinweise, ich habe sicherlich wieder viel gelernt.

                              Kommentar

                              Lädt...
                              X