Heinrich Krebs: Array Sortierung ändern (Mehrdimensionales Array)

Hallo zusammen.

Ich habe folgende Ausgangssituation:

...  
while ($AnfrageTemp = mysql_fetch_row ( $RitenSQL ))  
{  
	$Anfrage[$i]['Datum']  = $AnfrageTemp[0];  
	$Anfrage[$i]['Name']   = $AnfrageTemp[1];  
	$Anfrage[$i]['Stufe']  = $AnfrageTemp[2];  
	$Anfrage[$i]['SL1']    = $AnfrageTemp[3];  
	$Anfrage[$i]['SL2']    = $AnfrageTemp[4];  
	$Anfrage[$i]['ID']     = $AnfrageTemp[5];  
	$i++;  
}  
...

In dem Array liegen die Werte in der Reihenfolge, in der sie per SQL geholt wurden, nach Datum sortiert. Das ist für den ersten Arbeitsschritt auch sinnvoll so.
In einem späteren Arbeitsschritt brauche ich die Daten aber sortiert nach der Stufe. Die Frage ist nun, wie kann ich diese Tabelle so umsortieren, dass danach die Bezüge noch stimmen.
Ist das in PHP überhaupt möglich (ich werde aus der Beschreibung der Array-Sort Funktionen nicht so schlau) oder ist es einfacher die Daten neu per SQL zu holen ?

Vielen Dank für etwaige Antworten.
Heinrich

  1. In dem Array liegen die Werte in der Reihenfolge, in der sie per SQL geholt wurden, nach Datum sortiert. Das ist für den ersten Arbeitsschritt auch sinnvoll so.

    Ist es wirklich sinnvoll innerhalb desselben Scripts zwei mal die vollständige Datensammlung in unterschiedlichen Sortierreihenfolgen zu haben?

    Ist das in PHP überhaupt möglich (ich werde aus der Beschreibung der Array-Sort Funktionen nicht so schlau) oder ist es einfacher die Daten neu per SQL zu holen ?

    Es ist ohne weiteres möglich, tabellenähnliche Arrays in PHP zu sortieren - array_multisort() wird dich interessieren - besonders das dritte Beispiel.

    Es kommt aber auf die Datenmenge an - ggf ist es schneller 2 SQL Abfragen zu machen anstatt einer und diese dann per PHP herumzuschaufeln. Datenbanken können eines gut: Daten handhaben, dafür sollte man sie auch nutzen.

    1. Ist es wirklich sinnvoll innerhalb desselben Scripts zwei mal die vollständige Datensammlung in unterschiedlichen Sortierreihenfolgen zu haben?

      Naja, ich muss die Daten einmal nach Datum sortiert haben, um eine Historie zu generieren. Auf der selben Seite ist aber auch ein Bereich, in dem alles nach der Stufe sortiert ausgegeben werden soll.
      Irgendwie das Array umsortieren erscheint also der sinnvollste Schritt, damit ich es mit einfachem Hochzählen von $i ausgeben kann.

      Es ist ohne weiteres möglich, tabellenähnliche Arrays in PHP zu sortieren - array_multisort() wird dich interessieren - besonders das dritte Beispiel.

      Hatte ich gelesen, aber nicht so richtig kapiert, wie ich es anwende. Aber der Hinweis mit dem 3. Beispiel bringt mich hoffentlich weiter.

      Vielen Dank.

      1. Irgendwie das Array umsortieren erscheint also der sinnvollste Schritt, damit ich es mit einfachem Hochzählen von $i ausgeben kann.

        Warum schreibst du den Krempel überhaupt in ein Array und gibst ihn nicht gleich in der Schleife aus, die das Datenbankrückgabeobjekt durchackert?

      2. Hello,

        Naja, ich muss die Daten einmal nach Datum sortiert haben, um eine Historie zu generieren. Auf der selben Seite ist aber auch ein Bereich, in dem alles nach der Stufe sortiert ausgegeben werden soll.
        Irgendwie das Array umsortieren erscheint also der sinnvollste Schritt, damit ich es mit einfachem Hochzählen von $i ausgeben kann.

        Was heißt hier selbe Seite?
        Meinst Du die Anzeige der Daten oder die Links auf die Anzeige?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

        Es ist ohne weiteres möglich, tabellenähnliche Arrays in PHP zu sortieren - array_multisort() wird dich interessieren - besonders das dritte Beispiel.

        Hatte ich gelesen, aber nicht so richtig kapiert, wie ich es anwende.

        Ich würde sowieso usort den Vorzug geben.

        (Auch wenn sich sicher gleich wieder ein Experte findet, der erklären möchte, mit array_multisort ginge das auch, man müsste nur die Arraystruktur ein bisschen umstellen, ...)

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Ich würde sowieso usort den Vorzug geben.

          Okay. Ich werde das testen. Für den Moment hole ich die Daten halt nochmal umsortiert neu aus der Datenbank.

          Dennoch Danke.

          1. Hello,

            Ich würde sowieso usort den Vorzug geben.

            Ich nicht. Ich würde das Array anders herum aufbauen, als "Spaltenarray"

            Okay. Ich werde das testen. Für den Moment hole ich die Daten halt nochmal umsortiert neu aus der Datenbank.

            Es hängt ja ohnehin davon ab, ob die Daten für EINE EINZIGE Response benötigt werden, oder aber die Sortierung auch durch unterschiedliche Requests veranlasst wurde.

            Wenn sie in unterschiedlichen Sichten (Responses) benötigt werden, dann muss man sie ohnehin wieder zwischenspeichern und dann ist für die alternative neuerliche Abfrage aus der Datenbank ohnehin das geforderte Zeitverhalten (M$ nennt das Snapshot und Dynaset) relevant.

            Wenn eine gezielte Abfrage für einen Vorgang durchgeführt wird, und dieser mehrere Roundturns (Requests / Responses) benötigt, dann ist es meistens richtig, das Abfrageergebnis statisch zu speichern und nicht nur die Abfragevorschrift.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

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

              Ich würde sowieso usort den Vorzug geben.

              Ich nicht. Ich würde das Array anders herum aufbauen, als "Spaltenarray"

              Dass ich schon befürchtet habe, dass mal wieder jemand mit diesem Nonsense-Vorschlag kommt, schrieb ich ja bereits.

              Warum ich von ihm wenig halte, auch schon mal (früher).

              MfG ChrisB

              --
              Light travels faster than sound - that's why most people appear bright until you hear them speak.
              1. Hello,

                Na, nun halt mal die Füße still. Das ist kein Nonsens, sondern die richtige Datenorganisation.

                Warum ich von ihm wenig halte, auch schon mal (früher).

                ... na weil Du nichts kannst und deshalb Angst hast.  :-P

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

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

                  Na, nun halt mal die Füße still. Das ist kein Nonsens, sondern die richtige Datenorganisation.

                  Nicht "richtiger" als andere.

                  Warum ich von ihm wenig halte, auch schon mal (früher).

                  ... na weil Du nichts kannst und deshalb Angst hast.  :-P

                  Fass' dir mal an die eigene Nase, was Hinweise bezüglich Posting-Verhalten und Ausdrucksweise angeht.

                  MfG ChrisB

                  --
                  Light travels faster than sound - that's why most people appear bright until you hear them speak.
                  1. Hello,

                    Na, nun halt mal die Füße still. Das ist kein Nonsens, sondern die richtige Datenorganisation.

                    Nicht "richtiger" als andere.

                    Doch! Sie passt nämlich zu den vorgesehenen weiteren Schritten und zu den vorhandenen Standardfunktionen für Arrays. Und das sind etliche. Warum sollte man die alle neu schreiben? Nur, weil Du ein Böckchen hast und dich nicht trennen kannst von Deiner Meinung?

                    Außerdem würden die selbst zu erstellenden Funktionen alle sehr viel langsamer werden und das Array würde im Speicher sehr viel mehr Platz benötigen.

                    Außerdem ermöglicht sie das gleichzeitige Vorhalten der Sortierungen nach allen allen Spalten.

                    Warum Du vernünftigen Argumenten gegenüber so verschlossen bleibst, ist mir nicht klar bisher. Und Du hast auch bisher nicht begründen können, warum Deine Lösung die richtige[tm] sein soll...

                    Das "Zusammenhalten" von Daten geschieht über den Index. Im Speicher leigen die Array-Elemente ohnehin wild verstreut. Da lässt sich PHP nicht reinreden. Es handelt sich ja nicht mehr um ein Array klassischer Bauart, bei dem alle Elemente (und Elementegruppen) brav hintereinander im Speicher liegen udn jeder Index auch vorhanden sein muss. Es besteht also kein Grund mehr für deine Art der "Zusammenfassung". Es besteht keine physische Bindung zwischen den Einzelelementen...

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

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

                      Das "Zusammenhalten" von Daten geschieht über den Index.

                      Und genau darum geht es mir.

                      Dein Ansatz hält die Daten nicht auf Ebene eines Datensatzes zusammen - sondern auf Ebene einzelner Eigenschaften.

                      Meine Daten sehen so aus:

                      Array  
                      (  
                          [0] => Array  
                              (  
                                  [vorname] => Hermann  
                                  [nachname] => Müller  
                              )  
                          [1] => Array  
                              (  
                                  [vorname] => Rosalinde  
                                  [nachname] => Schmidt  
                              )  
                      )
                      

                      Und deine so:

                      Array  
                      (  
                          [vorname] => Array  
                              (  
                                  [0] => Hermann  
                                  [1] => Rosalinde  
                              )  
                          [nachname] => Array  
                              (  
                                  [0] => Müller  
                                  [1] => Schmidt  
                              )  
                      )
                      

                      Damit ist bei dir die Integrität der Daten durch unbedachten Umgang damit im Script sehr viel gefährdeter.

                      Wenn du versehentlich mal nur die Dimension $daten['vorname'] des Daten-Arrays (andersherum) sortierst, dann hast du nämlich plötzlich einen Hermann Schmidt und eine Rosalinde Müller in deinen Daten.

                      Dass bei meinem Datenmodell zusammengehörige Daten wie der Vorname Hermann und der Nachname Müller mal "auseinandergerissen" würden, ist sehr viel unwahrscheinlicher.

                      Im Speicher leigen die Array-Elemente ohnehin wild verstreut.

                      Das ist mir Wurst; mir geht es um den Zugriff, den ich aus dem PHP-Scriptcode heraus auf die Daten habe.

                      Es besteht also kein Grund mehr für deine Art der "Zusammenfassung".

                      Oh doch.

                      Es besteht keine physische Bindung zwischen den Einzelelementen...

                      Aber eine logische.

                      (Ja, ich weiss, dass eine logische Bindung bei deinem Datenmodell auch besteht. Bei dir ist diese Bindung aber sehr viel verletzbarer.)

                      MfG ChrisB

                      --
                      Light travels faster than sound - that's why most people appear bright until you hear them speak.
                      1. Hi!

                        Damit ist bei dir die Integrität der Daten durch unbedachten Umgang damit im Script sehr viel gefährdeter.

                        Bei unbedachtem Umgang sind alle Daten gefährdet, egal wie sie strukturiert sind.

                        Wenn du versehentlich mal nur die Dimension $daten['vorname'] des Daten-Arrays (andersherum) sortierst, dann hast du nämlich plötzlich einen Hermann Schmidt und eine Rosalinde Müller in deinen Daten.

                        Der Sinn hinter diesen Spaltenarrays ist, dass man diese Unter-Arrays einzeln umsortieren kann. Dies geht nämlich als _ein_ Funktionsaufruf einer der eingebauten PHP-Funktionen. Allerdings muss man darauf achten, dass die Assoziation des Schlüssels zum Wert nicht verloren geht, also asort() statt sort() verwendet wird. Beim Zeilenarray muss man sich in aller Regel für jedes Sortierkriterium eine benutzerdefinierte Vergleichsfunktion schreiben.

                        Es gibt jedoch auch (mindestens) einen Anwendungsfall, der mit Spaltenarray nicht zu lösen ist, jedenfalls nicht auf die einfache Ein-Funktionsaufruf-Sortiermethode - wenn ich jetzt keinen Denkfehler habe. Man kann zwar beispielsweise das Ortsarray absteigend und das Namensarray aufsteigend sortiert vorliegen haben. Das Anwenden von asort() auf eines der Spaltenarrays kann aber bei gleichen Werten nicht in die anderen Arraya schauen, um anhand der anderen Spalten eine eindeutige Reihenfolge zu ermitteln. Für den Zweck benötigt man dann doch wieder eine benutzerdefinierte Vergleichsfunktion und der Spaltenarray-Vorteil ist hin.

                        Dass bei meinem Datenmodell zusammengehörige Daten wie der Vorname Hermann und der Nachname Müller mal "auseinandergerissen" würden, ist sehr viel unwahrscheinlicher.

                        Mit Wahrscheinlichkeit hat das nicht viel zu tun sondern mit den Fähigkeiten des Programmierers. Wieviel Programmierer absolut oder prozentual damit nicht umgehen können, ist doch für den Einzelfall uninteressant.

                        Lo!

                        1. Hi,

                          Bei unbedachtem Umgang sind alle Daten gefährdet, egal wie sie strukturiert sind.

                          Mit Wahrscheinlichkeit hat das nicht viel zu tun sondern mit den Fähigkeiten des Programmierers. Wieviel Programmierer absolut oder prozentual damit nicht umgehen können, ist doch für den Einzelfall uninteressant.

                          Wenn man beides aber vor dem Hintergrund betrachtet, dass diese Vorgehensweise hier wiederholt Anfängern aufgezeigt wird, die merken lassen, dass sie vom Umgang mit Arrays allgemein noch wenig Ahnung haben, halte ich die Bedenken nach wie vor für angebracht.

                          MfG ChrisB

                          --
                          Light travels faster than sound - that's why most people appear bright until you hear them speak.
                          1. Hi!

                            Hi,

                            Bei unbedachtem Umgang sind alle Daten gefährdet, egal wie sie strukturiert sind.

                            Mit Wahrscheinlichkeit hat das nicht viel zu tun sondern mit den Fähigkeiten des Programmierers. Wieviel Programmierer absolut oder prozentual damit nicht umgehen können, ist doch für den Einzelfall uninteressant.

                            Wenn man beides aber vor dem Hintergrund betrachtet, dass diese Vorgehensweise hier wiederholt Anfängern aufgezeigt wird, die merken lassen, dass sie vom Umgang mit Arrays allgemein noch wenig Ahnung haben, halte ich die Bedenken nach wie vor für angebracht.

                            Das ist in meinen Augen etwa so argumentiert, wie: Halte dich fern von Dingen, die du nicht verstehst. Wie soll man denn dann Wissen und Erfahrung aufbauen, wenn man sie meiden soll? Wobei es nicht um Dinge geht, die man allgemein meiden sollte, weil sie stets mehr Nachteile als Vorteile enthalten. Aber auch damit muss man umzugehen lernen. Man lernt auch aus negativer Erfahrung. Und warum sollte sich das Spaltenarray nicht dazu eignen, Anfängern Erfahrung im Umgang mit Arrays zu verschaffen? Es verlangt ja keiner (ich jedenfalls nicht), dass es als Allheilmittel dargestellt wird, sondern als eine von mehreren Möglichkeiten, die alle ihre Eigenschaften haben, die man in konkreten Situationen als Vorteil oder Nachteil bewerten muss. "Ich beschreib's dir nicht, weil du dir damit Schaden zufügen kannst", kann jedenfalls nicht die Lösung sein.

                            Lo!

                          2. Hello,

                            Wenn man beides aber vor dem Hintergrund betrachtet, dass diese Vorgehensweise hier wiederholt Anfängern aufgezeigt wird, die merken lassen, dass sie vom Umgang mit Arrays allgemein noch wenig Ahnung haben, halte ich die Bedenken nach wie vor für angebracht.

                            Ok, geben wir Anfängern demnächst also lieber den Rat, Fußballspielen zu gehen, anstatt sich mit Programmieraufgaben herumzuplagen :-)

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

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

                          Es gibt jedoch auch (mindestens) einen Anwendungsfall, der mit Spaltenarray nicht zu lösen ist, jedenfalls nicht auf die einfache Ein-Funktionsaufruf-Sortiermethode - wenn ich jetzt keinen Denkfehler habe. Man kann zwar beispielsweise das Ortsarray absteigend und das Namensarray aufsteigend sortiert vorliegen haben. Das Anwenden von asort() auf eines der Spaltenarrays kann aber bei gleichen Werten nicht in die anderen Arraya schauen, um anhand der anderen Spalten eine eindeutige Reihenfolge zu ermitteln. Für den Zweck benötigt man dann doch wieder eine benutzerdefinierte Vergleichsfunktion und der Spaltenarray-Vorteil ist hin.

                          Entweder man benutzt array_multisort() http://de.php.net/manual/en/function.array-multisort.php dafür, dann gehen aber die numerischen Schlüssel kaputt. Die Zusammengehörigkeit der Werte der sortierten Spalten bleibt allerdings erhalten.

                          Will man die Schlüssel auf jeden Fall erhalten (was normal wäre), würde man der Einfachheit halber eine zusätzliche Spalte eingefügen, die alle zu sortirenden Werte enhält. Die kann man dann auch wieder ganz einfach sortieren. Bei einem DBMS enthält ein Index über mehrere Spalten auch meistens alle Spaltenwerte (concatiniert).

                          Die Vorteile beschränken sich nicht nur aufs Sortieren, sondern auch auf

                          Seziell für ChrisB:
                          Ich habe außerdem die vier Grundfunktionen für den Zugriff auf ein derartiges Spaltenarray hier schon mehrfach publiziert. Man kann also nicht "aus Versehen" die Daten durcheinanderbringen.
                          http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374

                          Die Funktionen sind universell, man muss sich sich also nur ein einziges Mal in seine Library aufnehmen.

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

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

    Ich habe folgende Ausgangssituation:

    ...

    while ($AnfrageTemp = mysql_fetch_row ( $RitenSQL ))
    {
    $Anfrage[$i]['Datum']  = $AnfrageTemp[0];
    $Anfrage[$i]['Name']   = $AnfrageTemp[1];
    $Anfrage[$i]['Stufe']  = $AnfrageTemp[2];
    $Anfrage[$i]['SL1']    = $AnfrageTemp[3];
    $Anfrage[$i]['SL2']    = $AnfrageTemp[4];
    $Anfrage[$i]['ID']     = $AnfrageTemp[5];
    $i++;
    }
    ...

    
    > In dem Array liegen die Werte in der Reihenfolge, in der sie per SQL geholt wurden, nach Datum sortiert. Das ist für den ersten Arbeitsschritt auch sinnvoll so.  
    > In einem späteren Arbeitsschritt brauche ich die Daten aber sortiert nach der Stufe. Die Frage ist nun, wie kann ich diese Tabelle so umsortieren, dass danach die Bezüge noch stimmen.  
    > Ist das in PHP überhaupt möglich (ich werde aus der Beschreibung der Array-Sort Funktionen nicht so schlau) oder ist es einfacher die Daten neu per SQL zu holen ?  
      
    Du kannst das Array auch anders aufbauen, dann kannst Du die Standard-Sortierfunktionen von PHP verwenden.  
      
    <http://forum.de.selfhtml.org/archiv/2009/5/t186344/#m1237456>  
    <http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374>  
    <http://forum.de.selfhtml.org/archiv/2009/5/t187239/#m1244379>  
      
      
    Das Ganze hat ganz besonders dann Sinn, wenn das Array z.B. in der Session gespeichert wird, und nicht jedes Mal neu aufgebaut werden soll. Da kann man dann sofort die Sortierung nach jeder Spalte abrufen.  
      
      
      
      
      
    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>