Mehrdimensionales Array neu sortieren

Cryog3n

Mitglied
Hi @ all!

Ich hol mir per sql statement Werte aus einer mysql-db und schreib das Ganze dann zeilenweise in ein Array.

Ein Wert des Arrays (nachdem sortiert wird und anschließend nochmals sortiert werden soll) muss pro Zeilendurchlauf mit anderen Kriterien verändert werden, sodass sich eine neue Sortierreihenfolge ergibt.

Nun müsste das Array nochmals sortiert werden, aber wie krieg ich das hin? So schaut das Ganze ungefähr aus.

$sql="select ... avg(..) .... from ... where ... group by.... order by Anzahl desc";
$erg = mysql_query ($sql);

if (mysql_num_rows ($erg) > 0) {
while($array = mysql_fetch_array($erg, MYSQL_ASSOC)) {
// Anzahl wird veraendert
$array["Anzahl"] = ... ; }}

So und jetz soll das Array erneut nach Anzahl DESC sortiert werden. Hab schon irgendwas in der Richtung array_multisort probiert, einfach was Google alles schon mal ausgespuckt hat, aber ich kriegs einfach nicht hin, da ich syntaktisch nicht ganz durchblicke. So sieht mein Versuch aus *g*

while(array_multisort($array, SORT_DESC, SORT_NUMERIC, $array["Anzahl"])) { ... }

? who can help?
 
Danke für die schnelle Antwort. usort() und uasort() hab ich mir auch schon durchgelesen, nur ich verstehs einfach nicht *g* Gibts dazu keine "genauere" Erklärung im Net evtl.? So in etwa usort für Dummies oder so? ;-)

Ne ernsthaft ich versteh das mit der Funktion nicht. Warum brauch ich ne Zahl als Rückgabewert und für was is das $key?

Will niemand zum weinen bringen *g* aber vielleicht hat jemand noch nen guten Link oder ähnliches!? Wäre klasse. Derweil les ich mich mal bissl tiefer rein.

Thx. Gruß, Cry
 
Das $key ist nur für die Ausgabe, nachzulesen bei [phpf]foreach[/phpf].

Hinter [phpf]usort[/phpf] steckt ein Sortieralgorithmus der, wie jeder andere seiner Art auch, immer zwei Elemente der zu sortierenden Daten miteinander vergleichen muss.
In den anderen Sortierfunktionen von PHP ist dieser Vergleich integriert. Daher arbeiten sie nur mit durch PHP standardmäßig vergleichbaren Datentypen. Die Datensätze in Deinem Array sind selbst Arrays, Arrays kann PHP aber nicht bezüglich einer Ordnung vergleichen, sondern nur sagen, ob sie gleich oder ungleich sind.

Nun kommt [phpf]usort[/phpf] ins Spiel. Der dahinterstehende Algorithmus ist blöd und weiß selbst nicht, wie er zwei Dinge vergleichen soll. Daher fragt er eine Funktion, die Du ihm übergibst (als String, der den Funktionsnamen enthält bzw. als Array mit zwei Elementen, wenn es sich um eine Funktion in einer Klasse handelt). Dieser Funktion übergibt er zwei Elemente (Du musst dafür sorgen, dass Deine Funktion auch genau zwei Argumente akzeptiert), die er verglichen haben möchte.

In Deiner Funktion kommt also jeweils ein Datensatz als Array oder Objekt an (so wie Du ihn mit mysql_fetch_* ausgelesen hast). Du hast in der Funktion also zwei Datensätze als eindimensionales Array mit Deinen projezierten Feldern als Index. Hier vergleichst Du die Felder (= Array-Indizes) Anzahl miteinander und gibst 0 zurück, wenn sie identisch sind, -1, wenn das erste Argument kleiner ist und +1, wenn das erste Argument größer ist.

Soviel zu [phpf]usort[/phpf]. Die Frage ist allerdings, ob das sinnvoll bzw. performant ist. Du könntest die Berechnung ja möglicherweise auch direkt im Query durchführen und MySQL nach dem berechneten Wert sortieren lassen. Dazu müsstest man aber wissen, wie Du ihn berechnest.

Gruß hpvw
 
Lässt sich die Manipulation die du da in PHP machst nicht evtl. schon zum Zeitpunkt des Queries machen? Weil dann könntest du direkt entsprechend Sortieren.

z.B.:

Code:
SELECT *, AVG(spalte1) as mittel, spalte2*spalte2 as quadrat FROM tabelle ORDER BY quadrat DESC;

Also sofern du für deine Manipulation nicht darauf angewiesen bist, alle Datensätze zu kennen, dürfte das wohl die eleganteste Lösung sein.
 
Vielen Dank für die Antworten und ein BIG MERCI für die Erklärung Jetzt steig ich da schon besser durch.

Das mit der Sortierung schon während des Queries wäre natürlich am besten, aber leider nicht ganz auch wenn ich das Ganze mit subselect oder union versuche, da ich eine komplizierte Berechnung für die Werte des Feldes durchführen muss. Das Feld selbst brauch ich als avg() und sortier das Ganze dann absteigend. Danach wirds aber komplizierter, da ich nen Quotienten dazu ermitteln muss sowie zeitliche und userspezifische Abhängigkeiten sowie temporäre Variablen (die aber auch aus der DB resultieren).

Nen SQL Guru hätte daran sicher Spaß, aber meine Gehirnwindungen übersteigt das.

Is hald dann irgendwann ein Nachteil, wenn man die DB solang kürzt bis man irgendwann die 3NF hat... oder wie ging das noch:suspekt:

Naja ich denke ich werd ne temporäre Tabelle machen... das Array einfach zur Laufzeit nach den Berechnungen da rein schmeissen, per SQL nochmals sortieren und easy ausgeben lassen. Wäre auch in Punkto Performance ne gute Lösung.

Grüße, Cry
 
Cryog3n hat gesagt.:
Is hald dann irgendwann ein Nachteil, wenn man die DB solang kürzt bis man irgendwann die 3NF hat... oder wie ging das noch:suspekt:
In der Regel erleichtert die Normalisierung die Bildung eines Querys, während "unnormale" Datenbanken bestimmte Abfragen unmöglich machen oder mühsame Klimmzüge erfordern. Allerdings muss man zugestehen, dass einige Operationen auf "unnormalen" Datenbanken performanter sind als in der 3. oder 4. NF.

Gruß hpvw
 
Zurück