Guma: Mehrdimensionales Array sortieren

Hallo zusammen,
hier meine kleine Buchliste als Array

Array
(
    [buchliste] => buchliste Object
        (
            [total] => 3
            [items] => Array
                (
                    [0] => 0001
                    [1] => 0002
                    [2] => 0003
                )

[itemname] => Array
                (
                    [0001] => Buch 2
                    [0002] => Buch 3
                    [0003] => Buch 1
                )

[itemprice] => Array
                (
                    [0001] => 3.99
                    [0002] => 2.59
                    [0003] => 7.59
                )

)

Die Ausgabe mit PHP:

$items = array();
foreach($this->items as $tmp_item)
{ ... return $items; }

Ich will das Array sortiern lassen:

nach itemprice (Preis aufstegend)

Mit dieser Sortierung benötige ich Hilfe.

Grüße Guma

    1. Danke für die Info, mein array hat eine andere Struktur und sie wie folgt aus, die sortierung soll nach itemprice erfolgen:

      [items] => Array
                      (
                          [0] => 0001
                          [1] => 0002
                          [2] => 0003
                      )

      [itemname] => Array
                      (
                          [0001] => Buch 2
                          [0002] => Buch 3
                          [0003] => Buch 1
                      )

      [itemprice] => Array
                      (
                          [0001] => 3.99
                          [0002] => 2.59
                          [0003] => 7.59
                      )

      array_multisort funktioniert hier wahrscheinlich nicht, muss ich mit usort eine Sortierung vornehmen? Guma

      1. Danke für die Info, mein array hat eine andere Struktur und sie wie folgt aus, die sortierung soll nach itemprice erfolgen:
        array_multisort funktioniert hier wahrscheinlich nicht, muss ich mit usort eine Sortierung vornehmen? Guma

        Hast du den verlinkten Thread genau studiert?

      2. Hello,

        Danke für die Info, mein array hat eine andere Struktur

        Du bist aber schon dricht dran, es richtiger zu machen...

        Dein Array hat eine "Spaltenstruktur" und gerade die lässt sich mit den Standard-Array-Funktionen von PHP erstklassig sortieren. Du musst nur beachten, dass die Index-Bindung dabei nicht verloren geht, also benutze z.B.

        asort($items['itemprice'],SORT_NUMERIC);

        Das Element "items" kannst Du dir schenken.
        Die Indexe mit vorangestellter Null sind unsicher. Bei der kleinsten Unaufmerksamkeit und bei Überlauf der Voranstellung wird der assoziative String-Index automatisch in einen numerischen Index umgewandelt. Also benutze ausschließlich numerische Indexe, oder stelle den en mit 000# auch noch einen Buchstaben voran.

        [items] => Array
                        (
                            [0] => 0001
                            [1] => 0002
                            [2] => 0003
                        )

        [itemname] => Array
                        (
                            [0001] => Buch 2
                            [0002] => Buch 3
                            [0003] => Buch 1
                        )

        [itemprice] => Array
                        (
                            [0001] => 3.99
                            [0002] => 2.59
                            [0003] => 7.59
                        )

        Die Korrelation der Spalten [itemname] und [itemprice] findet ja schon ganz richtig über den Index statt.

        Mit Hilfe der von mir hier schon öfter veröffetnlichten universellen Funktionen kannst Du dann Deine Datensätze holen, ändern, hinzufügen, löschen

        http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374

        Wenn Du eine Liste ausgeben lassen willst, kommt es nur noch darauf an, nach welcher Spalte Du die foreach()-Schleife iterieren lässt.

        Du kannst dann alle Sortierungen, also nach jeder Spalte, gleichzeitig bereit halten.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom vom Berg,

          danke für deine Antworten, mir ist jetzt klar, dass ich mein array nicht nur in "itemcat" ändern muss sondern in den anderen auch, sonst belibt, wie du schon sagst die Zuordnung nicht erhalten.

          Mein Problem startet leider schon weiter vorne. Ich habe keinen Weg gefunden, um die Arraywerte itemcat anzusprechen, die ich ja nummerisch sortieren will.

          Versuch war: asort($mycart['itemsortierung'],SORT_NUMERIC);
          Das führt aber zu keiner sortierung, denn er kennt $mycart['itemsortierung'] nicht. Was mache ich falsch?

          Danach folgt Schritt 2, die Umsortierung der anderen Werte durch eine Scheife.

          $new_list = array();  
          foreach ($this->item_cat as $key => $val) {  
            $new_list[] = $key;  
          }
          
          Hier nochmal mein Array:  
          Array  
          (  
              [mycart] => mycart Object  
                  (  
                      [pricetotal] => 7.96  
                      [menge] => 3  
                      [items] => Array  
                          (  
                              [0] => 601  
                              [1] => 873  
                              [2] => 874  
                          )  
            
                      [itemprices] => Array  
                          (  
                              [601] => 0.75  
                              [873] => 3.00  
                              [874] => 4.21  
                          )  
            
                      [itemqtys] => Array  
                          (  
                              [601] => 1  
                              [873] => 1  
                              [874] => 1  
                          )  
            
                      [itemname] => Array  
                          (  
                              [601] =>  Kiwi  
                              [873] =>  Salat  
                              [874] =>  Wurst  
                          )  
            
                      [itemcat] => Array  
                          (  
                              [601] => 2  
                              [873] => 8  
                              [874] => 4  
                          )  
            
                  )  
            
              [user_id] => 1  
              [user_nickname] => Guma  
          )
          

          Kannst Du mir auf die Sprünge helfen. Guma

          1. Hallo Tom,
            hatte einen Wert falsch drin. So war meine Frage gemeint:

            Versuch war: asort($mycart['itemcat'],SORT_NUMERIC);
            Das führt aber zu keiner sortierung, denn er kennt $mycart['itemcat'] nicht. Was mache ich falsch?

            Hier nochmal mein Array:  
            Array  
            (  
                [mycart] => mycart Object  
                    (  
                        [pricetotal] => 7.96  
                        [menge] => 3  
                        [items] => Array  
                            (  
                                [0] => 601  
                                [1] => 873  
                                [2] => 874  
                            )  
              
                        [itemprices] => Array  
                            (  
                                [601] => 0.75  
                                [873] => 3.00  
                                [874] => 4.21  
                            )  
              
                        [itemqtys] => Array  
                            (  
                                [601] => 1  
                                [873] => 1  
                                [874] => 1  
                            )  
              
                        [itemname] => Array  
                            (  
                                [601] =>  Kiwi  
                                [873] =>  Salat  
                                [874] =>  Wurst  
                            )  
              
                        [itemcat] => Array  
                            (  
                                [601] => 2  
                                [873] => 8  
                                [874] => 4  
                            )  
              
                    )  
              
                [user_id] => 1  
                [user_nickname] => Guma  
            )
            

            Kannst Du mir auf die Sprünge helfen. Guma

            1. Hello,

              hatte einen Wert falsch drin. So war meine Frage gemeint:

              Versuch war: asort($mycart['itemcat'],SORT_NUMERIC);
              Das führt aber zu keiner sortierung, denn er kennt $mycart['itemcat'] nicht. Was mache ich falsch?

              Du beachtest nicht, dass Du hier PHP-Arrays und PHP-Objekte gemischt verwendest, was durchaus erlaubt ist, aber eben dann zu diesen ADS-Fehlern führt.

              versuch es mal mit

              asort($mycart->itemcat,SORT_NUMERIC);

              Das sollte eigentlich dann klappen und keine Fehlermeldung mehr erzeugen.
              Die Fehlermeldungen möchten wir übrigens immer im Originaltext sehen hier, wenn derartige Fragen gestellt werden. Dazu musst Du dein Fehlermanagement auch vollständig eingeschaltet haben:

              error_reporting(E_ALL);        ## müsste noch ausreichen
                  ini_set('display_errors', 1);

              Hier nochmal mein Array:

              Array
              (
                  [mycart] => mycart Object
                      (
                          [pricetotal] => 7.96
                          [menge] => 3
                          [items] => Array
                              (
                                  [0] => 601
                                  [1] => 873
                                  [2] => 874
                              )

              [itemprices] => Array
                              (
                                  [601] => 0.75
                                  [873] => 3.00
                                  [874] => 4.21
                              )

              [itemqtys] => Array
                              (
                                  [601] => 1
                                  [873] => 1
                                  [874] => 1
                              )

              [itemname] => Array
                              (
                                  [601] =>  Kiwi
                                  [873] =>  Salat
                                  [874] =>  Wurst
                              )

              [itemcat] => Array
                              (
                                  [601] => 2
                                  [873] => 8
                                  [874] => 4
                              )

              )

              [user_id] => 1
                  [user_nickname] => Guma
              )

                
                
              BTW:  
              Meine Funktionen passen auf obige Abwandlung des "Spaltenarray"s natürlich nicht mehr in der Universalform. Dazu muss auch das Spaltenarray normiert vorliegen...  
                
                
                
                
              Liebe Grüße aus dem schönen Oberharz  
                
                
              Tom vom Berg  
              ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                
              
              -- 
              Nur selber lernen macht schlau  
              <http://bergpost.annerschbarrich.de>  
                
              
              
              1. Danke für die Infos,

                die sortierfunktion gibt eine fehlermeldung aus:
                Warning: asort() expects parameter 1 to be array, null given in mytest.php on line 96

                dort steht (96) asort($mycart->itemcat,SORT_NUMERIC);

                Ich komme einfach nicht über diese Hürde. Grüße Guma

                1. Hello,

                  Danke für die Infos,

                  Bitte.

                  die sortierfunktion gibt eine fehlermeldung aus:
                  Warning: asort() expects parameter 1 to be array, null given in mytest.php on line 96

                  dort steht (96) asort($mycart->itemcat,SORT_NUMERIC);

                  Ich komme einfach nicht über diese Hürde. Grüße Guma

                  Wie bist Du denn zu der Ausgabe gekommen:

                  Array
                  (
                      [mycart] => mycart Object
                          (
                              [pricetotal] => 7.96
                              [menge] => 3
                              [items] => Array
                                  (
                                      [0] => 601
                                      [1] => 873
                                      [2] => 874
                                  )

                  [itemprices] => Array

                  usw.

                  Da steht ja irgendwo

                  print_r($meine_variable);

                  also muss es auf der Ebene doch auch heißen

                  asort($meine_variable['mycart]->itemcat,SORT_NUMERIC);

                  Du musst schon die vollständige Referenz angeben auf das zu sortierende Array.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
      3. Hello,

        [itemname] => Array
                        (
                            [0001] => Buch 2
                            [0002] => Buch 3
                            [0003] => Buch 1
                        )

        Damit Du siehst, wie unsicher diese 000#-Keys sind hier ein kleines Denkscript aus meiner Sammlung:

        <?php   ### insert_key.php ###

        wo wird ein neues Arrayelement eingefügt?

        #------------------------------------------------
        function display(&$_liste)
        {
            echo "<pre>\r\n";
            echo htmlspecialchars(print_r($_liste,1));
            echo "</pre>\r\n";
        }
        #------------------------------------------------
        function display_types(&$_liste)
        {
            echo "<pre>\r\n";

        foreach($_liste as $key => $value)
            {
                echo htmlspecialchars($key).": ".gettype($key)."\r\n";
            }

        echo "</pre>\r\n";
        }
        #------------------------------------------------

        $_liste = array();

        $_liste[-20] = "Minus Zwanzig";
        $_liste[] = 9;
        $_liste[] = 1;
        $_liste[] = '01';

        display($_liste);

        $_liste[1] = 'neuer Datensatz';

        display($_liste);

        $_liste['ende'] = "Ende im Gelände";
        $_liste['anfang'] = "Das ist der Anfang";
        $_liste['2'] = "Element '2'";

        display($_liste);

        $_liste[] = "automatisch hinzu";
        $_liste['02'] = "Extra Key '02'";
        $_liste[02] = "und jetzt Extra Key 02 ohne Häkchen";

        $_liste[''] = "Leerer Key ist nicht kein Key";
        $_liste['7'] = "Key '7'";
        $_liste[5] = "Key 5";
        $_liste[-2] = "Element -2";

        display($_liste);
        display_types($_liste);

        ?>

        Du musst also beim Key nur mal die Häkchen vergessen und schon ist es passiert!

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de