Array nach Variable sortieren
Alex
- php
Hallo,
ich beabsichtige ein Array sortiert auszugeben. Als Sortierkriterium soll eine GET-Variable (sort) dienen.
Zunächst mein Code um eine Default-Sortierung zu bekommen:
if (isset($_GET['sort']))
{
$sort = $_GET['sort'];
}
else
{
$sort = "score";
}
Lasse ich mir den Wert mit echo ausgeben klappt das wunderbar (hier scheint der Fehler also vmtl. nicht zu liegen.
Deshalb der Code, der die Sortierung des Arrays (data) vornehmen soll:
function sortiere($adata, $bdata)
{
global $sort;
if( $adata[$sort] == $bdata[$sort])
{
return 0;
}
return ( $adata[$sort] < $bdata[$sort]) ? 1 : -1;
}
usort($data['players'], 'sortiere');
Das Array kommt unsortiert raus. Sowohl, wenn die GET-Variable gefüllt ist, als auch wenn sie leer ist.
Ich vermute, dass die Funktion die Variable ($sort) nicht erkennt, weiß aber nicht wieso. Mit global $sort;
müsste diese doch eigentlich verfügbar sein, oder?
Was mache ich hier noch falsch?
Freundliche Grüße
Alex
Trage ich statt einer Variablen einen festes Sortierkriterium (z. B. Punkte) ein, so funktioniert die Sortierung des Arrays wie gewünscht.
function sortiere($adata, $bdata)
{
if( $adata['punkte'] == $bdata['punkte'])
{
return 0;
}
return ( $adata['punkte'] < $bdata['punkte']) ? 1 : -1;
}
usort($data['players'], 'sortiere');
Hello,
ich beabsichtige ein Array sortiert auszugeben. Als Sortierkriterium soll eine GET-Variable (sort) dienen.
Wenn Du nur nach jeweils einer "Spalte" im Array sortieren willst, dann solltest Du vielleicht mal mit einer anderen Organisation der Daten anfreunden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello Tom!
Wenn Du nur nach jeweils einer "Spalte" im Array sortieren willst, dann solltest Du vielleicht mal mit einer anderen Organisation der Daten anfreunden.
Das Array bekomme ich fertig geliefert und ich habe diesbezüglich keine weiteren Einflussmöglichkeiten. Ich muss also mit dieser Organisation leben. Ich bin nur für die Ausgabe zuständig. Diese war bisher immer statisch nach "Punkten" sortiert (siehe Ergänzung). Jetzt will ich aber auch andere Sortierungen z. B. alphabetisch nach "Namen" ermöglichen.
Zur näheren Erläuterung:
Die Ausgabe erfolgt in einer Tabelle
Name | Punkte | ... | ... |
Tom | 100 | ... | ... |
Alex | 50 | ... | ... |
und ich will die Spalten verlinken und dann die jeweilige Spalte per GET übermitteln und als Sortierkriterium auslesen.
FG
Alex
Hi!
Lasse ich mir den Wert mit echo ausgeben klappt das wunderbar (hier scheint der Fehler also vmtl. nicht zu liegen.
Kurz nach dem Erzeugen würde ich auch nicht vermuten, dass sie nicht mehr da ist. Wie ist es in der Funktion? Mach die Kontrollausgabe dort (auch wenn sie dabei mehr als einmal ausgegeben wird, ist ja nur zum Test). Und nimm var_dump(), das ist zum Fehlersuchen informativer als ein schnödes echo. Das error_reporting auf E_ALL zu stellen (und display_error auf on) hilft auch immer wieder, Fehlern auf die Spur zu kommen.
if( $adata[$sort] == $bdata[$sort])
{
return 0;
}
return ( $adata[$sort] < $bdata[$sort]) ? 1 : -1;
Schau dir mal strcmp() an. Es sind doch Strings, oder? Sonst ergäbe $a minus $b auch ein passendes Ergebnis für alle drei Fälle.
Ich vermute, dass die Funktion die Variable ($sort) nicht erkennt, weiß aber nicht wieso. Mit
global $sort;
müsste diese doch eigentlich verfügbar sein, oder?
Eigentlich schon. Was ist der Rückabewert von usort()? true oder false?
Lo!
Hallo Dedlfix!
Erstmal vielen Dank für deine Antwort.
Lasse ich mir den Wert mit echo ausgeben klappt das wunderbar (hier scheint der Fehler also vmtl. nicht zu liegen.
Kurz nach dem Erzeugen würde ich auch nicht vermuten, dass sie nicht mehr da ist. Wie ist es in der Funktion? Mach die Kontrollausgabe dort (auch wenn sie dabei mehr als einmal ausgegeben wird, ist ja nur zum Test). Und nimm var_dump(), das ist zum Fehlersuchen informativer als ein schnödes echo. Das error_reporting auf E_ALL zu stellen (und display_error auf on) hilft auch immer wieder, Fehlern auf die Spur zu kommen.
Das mit den error_reporting und display_error kann ich auf dem hiesigen System leider nicht umsetzen. Die Ausgabe mit var_dump() ergibt NULL. Die Vermutung, dass $sort nicht in der Funktion verfügbar ist, liegt also nahe. Ich weiß nur nach wie vor nicht, wieso:
echo $sort
funktioniert.
function test()
{
global $sort;
echo $sort;
}
test();
hingegen nicht.
Woran kann es denn liegen, dass die globale Variable in der Funktion nicht verfügbar ist?
Ich vermute, dass die Funktion die Variable ($sort) nicht erkennt, weiß aber nicht wieso. Mit
global $sort;
müsste diese doch eigentlich verfügbar sein, oder?Eigentlich schon. Was ist der Rückabewert von usort()? true oder false?
True (1)
Mist, jetzt bin ich schon komplett verwirrt. Habe Dedlfix seinen Tipp mit var_dump natürlich auch umgesetzt.
function test()
{
global $sort;
var_dump ($sort);
}
test();
Ergebnis: NULL :-(
Hi!
Das mit den error_reporting und display_error kann ich auf dem hiesigen System leider nicht umsetzen.
Warum denn nicht? Das error_reporting lässt sich mit der gleichnamigen Funktion im Script umstellen, und falls display_erorrs ausgeschaltet ist, sollte das mit ini_set() einzuschalten gehen. Oder was genau spricht daegen, dass du es zu Testzwecken aktivierst.
Die Ausgabe mit var_dump() ergibt NULL. Die Vermutung, dass $sort nicht in der Funktion verfügbar ist, liegt also nahe.
Ja, und es sollte durch eine Notice-Meldung bestätigt werden.
Ich weiß nur nach wie vor nicht, wieso:
Existiert $sort denn unmittelbar vor dem Funktionsaufruf?
Woran kann es denn liegen, dass die globale Variable in der Funktion nicht verfügbar ist?
Eigentlich sehe ich als Grund nur eine Nichtexistenz. Man kann auch im Array $GLOBALS nachschauen, ob sie enthalten ist.
Was ist der Rückabewert von usort()? true oder false?
True (1)
usort() an sich läuft also problemlos.
Lo!
Das mit den error_reporting und display_error kann ich auf dem hiesigen System leider nicht umsetzen.
Warum denn nicht? Das error_reporting lässt sich mit der gleichnamigen Funktion im Script umstellen, und falls display_erorrs ausgeschaltet ist, sollte das mit ini_set() einzuschalten gehen. Oder was genau spricht daegen, dass du es zu Testzwecken aktivierst.
Dagegen sprach, dass ich bis gerade nur auf einem Echtsystem (online) testen konnte. Jetzt habe ich XAMPP installiert und das hier
<?php
error_reporting(6143);
ini_set("display_errors", TRUE);
$var = "Hallo";
function test()
{
global $var;
var_dump $var;
}
test();
?>
lokal getestet => Funktioniert: 'string(5) "Hallo"' wird ausgegeben!
Die Ausgabe mit var_dump() ergibt NULL. Die Vermutung, dass $sort nicht in der Funktion verfügbar ist, liegt also nahe.
Ja, und es sollte durch eine Notice-Meldung bestätigt werden.
Online hingegen (gleicher Code) bleibt die Seite leer und es kommt auch keine Notice-Meldung oder ähnliches.
Ich weiß nur nach wie vor nicht, wieso:
Existiert $sort denn unmittelbar vor dem Funktionsaufruf?
Ja, direkt vor der Funktion kann ich den Inhalt von $sort ausgeben.
Woran kann es denn liegen, dass die globale Variable in der Funktion nicht verfügbar ist?
Eigentlich sehe ich als Grund nur eine Nichtexistenz. Man kann auch im Array $GLOBALS nachschauen, ob sie enthalten ist.
Das stelle ich erstmal hinten an, weil das Problem nicht mit der GET-Variable an sich, sondern generell mit der Variablen in der Funktion zusammenzuhängen scheint.?
Was ist der Rückabewert von usort()? true oder false?
True (1)usort() an sich läuft also problemlos.
Danke, dass du mir schonmal geholfen hast, dass Problem einzuschränken :-)
Hi,
ich beabsichtige ein Array sortiert auszugeben. Als Sortierkriterium soll eine GET-Variable (sort) dienen.
function sortiere($adata, $bdata)
{
global $sort;
if( $adata[$sort] == $bdata[$sort])
{
return 0;
}
return ( $adata[$sort] < $bdata[$sort]) ? 1 : -1;
}usort($data['players'], 'sortiere');
Probier doch mal, in sortiere() direkt das $sort zu definieren. Also etwa so
~~~php
function sortiere($adata, $bdata)
{
$sort = isset($_POST['sort']) ? $_POST['sort'] : 'score';
if( $adata[$sort] == $bdata[$sort])
{
return 0;
}
return ( $adata[$sort] < $bdata[$sort]) ? 1 : -1;
}
$_POST sollte als superglobale immer verfügbar sein.
Wenn du noch sichergehen willst, dass keine Hinweise wg. falschem Array-Zugriff kommen, wenn jemand die Eingabedaten manipuliert, dann kannst du auch noch
$sort = isset($_POST['sort']) && key_exists($_POST['sort'], $adata) ? $_POST['sort'] : 'score';
schreiben.
Bis die Tage,
Matti
Hallo Matti,
mit deinem Workaround klappt es :-)
Hab jedoch mit GET gearbeitet:
function sortiere($adata, $bdata)
{
$sort = isset($_GET['sort']) ? $_GET['sort'] : 'score';
if( $adata[$sort] == $bdata[$sort]) {
return 0;
}
return ( $adata[$sort] < $bdata[$sort]) ? 1 : -1;
}
Vielen lieben Dank an dich und Dedlfix :-)