Ausgabe sortieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktuelle punkte
argument
array
ausgabe
code
dank
datum
editor
ergebnis
ermitteln
funktion
hilfe
http
point
punkt
resultat
schleife
sortieren
string
url
-
Hi,
ich steh mal wieder etwas auf dem Schlauch und bräuchte Hilfe.
Kurz zur Erklärung, ich lese Daten aus einer DB aus und gebe diese in einer while Schleife aus. Wären die Daten in der Schleife ausgegeben werden, wird zusätzlich zum aktuellen Datensatz ein Punktestand aus einer XML Datei abgerufen. So bekomme ich die Livepunkte des User.
Soweit läuft das alles auch wie es soll, nun möchte ich aber die Daten die am Ende ausgegeben werden nach den Punkten sortieren, die aus der XML ausgelesen werden. Genau da stehe ich nun auf dem Schlauch, ich bekomme die Daten natürlich über WHERE direkt an der DB sortiert, das reicht aber nicht.
Hier mal ein Codestück, vielleicht versteht man es damit ja..
$ergebnis = mysql_query("SELECT * FROM eintragen WHERE art = 2 AND kw < $searchKW ORDER by endzeit DESC"); $menge = mysql_num_rows($ergebnis); while($row = mysql_fetch_object($ergebnis)) { $id= $row->id;// ID in der DB, anhand dieser rufe ich dann die XML auf $punkte = $row->punkte; // das sind die Punkte in der DB $name = $row->name;// Name DB /////////////////////////////////////////////////////////////////////// //***** // Ermitteln der aktuelle Punkte für Punkteüberwachung***/// /////////////////////////////////////////////////////////////////////// $xml_user = simplexml_load_file("http://www.urlzurapi/api/user.{$id}.xml"); $punkte_live = $xml_user->user[0]->points[0];// nach diesen Punkten möchte ich nun die ausgabe //sortieren. ///////////////////////////////////////////////////////////////////////////// //***** // //EMDE!!!Ermitteln der aktuelle Punkte für Punkteüberwachung***/// /////////////////////////////////////////////////////////////////////// // Hier möchte ich jetzt nach $punkte_live sortieren, das sind die Punkte aus der XML. //Die Daten werden natürlich in einer Tabelle ausgegeben. Zwecks Codelänge mal abgekürzt echo "$name<br>"; echo "$punkte<br>"; echo "$punkte_live";
Vielleicht kann mir ja jemand einen Tipp geben, ich habe es schon mit sort probiert, das war das einzige was ich über Google finden konnte..
Danke für die Hilfe wie immer
LG
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
das kannst du am leichtesten mittels eines Arrays und der Funktion usort machen.
Ich nehme dazu einfach mal dein Beispiel und passe es etwas an.
// Bereite das SQL vor $sql = <<<HERE_ENDS_SQL SELECT * FROM eintragen WHERE art = 2 AND kw < %s ORDER BY endzeit DESC HERE_ENDS_SQL; $sql = sprintf($sql, $searchKW); $ergebnis = mysql_query($sql); $menge = mysql_num_rows($ergebnis); $rows = array(); while($row = mysql_fetch_array($ergebnis)) { // speichere das reultat im $rows-array $rows[$row['id']] = $row; // das hier ist großer scheiß, weil es total // unperformant und bestimmt noch verbesserungsfähig ist $url = "http://www.urlzurapi/api/user.{$row['id']}.xml"; $xml_user = simplexml_load_file($url); // wie auch immer speichere die Spalte ebenfalls im Array $rows[$row['id']]['punkte_live'] = $xml_user->user[0]->points[0]; } // Sortiere das array anhand von punkte_live absteigend usort($rows, function($arr1, $arr2){ return $arr1['punkte_live'] < $arr2['punkte_live'] ? 1 : -1; }); // Ausgabe des sortierten Ergebnisses... foreach($rows as $row) printf( "%s<br/>%s<br/>%s", $row['name'], $row['punkte'], $row['punkte_live'] );
Ich denke das sollte reichen, wobei dein Code nicht sehr übersichtlich ist, ohne Einrückungen und mit fehlenden Klammern…
Mit freundlichen Grüßen -
Hi,
ich danke Dir für die Hilfe, damit habe ich es jetzt hinbekommen.
Allerdings habe ich da noch ein Problem mit dem COde von Dir,
das
wird bei mir als Syntaxfehler angezeigt, also imusort
Dreamweaver.
Das sortieren selber läuft aber komischerweise.
usort($rows, function($arr1, $arr2){ return $arr1['punkte_live'] < $arr2['punkte_live'] ? 1 : -1; });
Hast Du da evtl. noch eine Idee woran das liegen könnte?
Bei der Codeübersicht muss ich Dir leider recht geben, ich versuche mich da schon zu ändern.
Im Code von mir fehlt aber nur eine Klammer am Ende für die while, die habe ich hier vergessen.
Beitrag zuletzt geändert: 4.9.2013 16:18:07 von aff3m1tw4ff3 -
Natürlich! Benutze einen anständigen Editor! Dreamweaver ist der größte Dreck…
Ich selbst benutze vim, aber der erfordert richtig viel Einarbeitungszeit und ist auf Windows – naja eher suboptimal, halt nen Unix-Editor.
Auf Windows benutze ich normalerweise Notepad++ oder auch Eclipse, wenn ich eine IDE haben will.
Übrigens zeigt dir der Dreamweaver den Fehler an, weil diese Syntax erst mit PHP 5.3 eingeführt wurde und der Dreamweaver wie gesagt scheiße und noch nicht so aktuell ist.
Vor PHP 5.3 musste man die Funktion noch als String übergeben und vorher bereits deklarieren, oder mittels create_function zur Laufzeit eine Funktion zusammenbauen, was aber noch umständlicher ist. Das sah dann etwa so aus:function sorter($arr1, $arr2){ return $arr1['punkte_live'] < $arr2['punkte_live'] ? 1 : -1; } usort($rows, 'sorter');
Die neuere Schreibweise nennt sich Lambda-Funktion. Eine Lambda-Funktion ist eine Funktion, die ohne Angabe eines Namens geschrieben wird und direkt als Argument übergeben wird. In Javascript ist das ein übliches Verfahren, wenn du z.B. an die each-Funktion aus diversen JS-Libs denkst, die erwartet ja auch eine Funktion als Argument. In MooTools sähe das so aus:// Variante 1 var alertEntry = function(entry){alert(entry)}; [1,2,3,4,5].each(alertEntry); // Variante 2 [1,2,3,4,5].each(function(entry){alert(entry)});
Bei JS kommt hierbei in bestimmten Situationen auch noch ein Performanceunterschied zustande, der jedoch normalerweise zu vernachlässigen ist. Wie der Unterschied in PHP ist weiß ich nicht, er dürfte jedoch ebenfalls zu vernachlässigen sein.
Mit freundlichen Grüßen
Beitrag zuletzt geändert: 4.9.2013 17:54:45 von nemoinho -
Hi,
mal wieder danke für die Traumhafte Erklärung. Das mit Dw gibt mir natürlich zu denken. Ich hatte mich schon mal nach einem neuen
Editor umgeschaut, dabei bin ich auf Scriptly gestoßen. Allerdings hatte ich noch kenie Zeit mich in ein neues Prog einzuarbeiten. Das
sollte ich aber, wie es scheint dringend mal tun.
Ich habe da doch noch ein Problem mit dem Code. Das die Ausgabe gestern noch sortiert war, war mehr Zufall. Die „Livepunkte“
passten einfach nur gerade zu den Namen. Die Ausgabe selber wird leider nach den Namen sortiert. Ich habe mich nun die halbe Nacht
davor geklemmt und bekomme es nicht gebacken. Ich habe mitlerweile alles an Code entfernt was für die Abfrage erst mal nicht benötigt
wird, übrig blieb Quasi Dein Code…
////////////////////////////////////////////////////// //***** Auslesen der verfügbaren User***////////////// ///////////////////////////////////////////////////// $sql = <<<HERE_ENDS_SQL SELECT * FROM eintragen WHERE art = 1 AND kw > %s HERE_ENDS_SQL; $sql = sprintf($sql, $searchKW); $ergebnis = mysql_query($sql); $menge = mysql_num_rows($ergebnis); /////////////////////////////////////////////////////////////////////// //***** // Livepunkte ermitteln und ins rows array speichern***/// /////////////////////////////////////////////////////////////////////// $rows = array(); while($row = mysql_fetch_array($ergebnis)) { // speichere das reultat im $rows-array $rows[$row['id']] = $row; // das hier ist großer scheiß, weil es total // unperformant und bestimmt noch verbesserungsfähig ist $url = "http://www.URLZURAPI/dev/api/user.{$row['id']}.xml"; $xml_user = simplexml_load_file($url); // wie auch immer speichere die Spalte ebenfalls im Array $rows[$row['id']]['punkte_live'] = $xml_user->user[0]->points[0]; } // hier das eigentlich sortieren unter Zuhilfenahme der eigenen Vergleichsfunktion usort($rows, function($arr1, $arr2){ return $arr1['punkte_live'] < $arr2['punkte_live'] ? 1 : -1; }); // Ausgabe des sortierten Ergebnisses... foreach($rows as $row){ $punkte_live_ausgbae = $row['punkte_live']; printf( "%s<br/>%s<br/>%s", $row['name'], $row['punkte'], $row['punkte_live'] ); }
Vielleicht hast Du ja noch nen Tipp für mich was ich da wieder falsch mache….
Eine Augabe der Seite findest Du hier http://www.malle-downfight.de/fightsuche_hoch_test.php
LG
EDIT:
so einfach geht das, wenn man in die Doku schaut: http://www.php.net/manual/de/simplexml.examples-basic.php#example-5231 da steht, dass man das Resultat zu einem String casten muss, wenn die Operation einen String erfordert. Das kann man so wie im Beispiel machen, indem man(string)
davor schreibt, oder indem man den Kontext, in dem das Resultat behandelt wird entsprechend bildet. In diesem Fall ist es am sinnvollsten den Kontext anzupassen und dadurch das Resultat zu einem Integer umzuformen. Das geht ganz einfach indem du an die Anfrage eine Multiplikation mit 1 anhängst. Du musst also nur diese eine Zeile anpassen:$rows[$row['id']]['punkte_live'] = $xml_user->user[0]->points[0]*1;
Danke an nemoinho für die Hilfe bei der Lösung!!
Beitrag zuletzt geändert: 9.9.2013 14:13:11 von hackyourlife -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage