Seite 1 von 1
Daten sortieren vor Ausgabe
Verfasst: Mi 11.Okt, 2006 16:34
von shadowrider
da ich keinen passenden Mod fand, habe ich mir mal einen 'umgebaut'.
folgendes Problem:
die Daten werden original absteigend nach einem, per sql-eingelesenem, Feld sortiert.
Ich möchte aber die Ausgabe sortiert nach einem berechneten Feld erreichen,
genaugenommen nach $g2 absteigend, errechnet in Zeile 84-93.
(habe mich zwar erfolgreich durch die Zeitberechnungen gekämpft, durchschaue aber die Array-Geschichte nicht)
ich hänge die php mal hier an in der Hoffnung, jemand hilft mir aus der Klemme....
Verfasst: Mi 11.Okt, 2006 16:54
von oxpus
Du kannst auch in einer Sortieranweisung (ORDER BY) in SQL berechnen und dann kommen die Datensätze auch nach den Ergebnissen sortiert zurück...
Verfasst: Mi 11.Okt, 2006 17:00
von shadowrider
das Feld gibt es ja vorher noch nicht, der Wert wird ja erst durch einige Operationen errechnet
Verfasst: Mi 11.Okt, 2006 17:47
von oxpus
Kann das nicht mit den Werten der restlichen Felder errechnet werden?
Verfasst: Mi 11.Okt, 2006 18:00
von shadowrider
ähm - ja, wohl doch, denn ich errechne es ja damit, aber wie bring ich den ganzen Komplex in die sql-Abfrage?
Code: Alles auswählen
$g = $row['user_lastlogon'];
if ($row['user_lastlogon'] == 0) $g = $row['user_regdate'];
$t = time();
$gMonth = date("n", $g);
$tMonth = date("n", $t);
$gYear = date("Y", $g);
$tYear = date("Y", $t);
$g2 = (($tYear - $gYear) * 12) + ($tMonth - $gMonth);
Verfasst: Mi 11.Okt, 2006 18:50
von oxpus
Öhm, nun, es werden datenbankfremde Daten herangezogen, das klappt dann nicht.
Also bliebe nur noch sort() oder auch ksort() über...
Hast Du ein mehrdimensionales Array oder ein einfaches?
Verfasst: Mi 11.Okt, 2006 19:07
von shadowrider
wenn ich alles richtig übersehe, ist es ein mehrdimensionales
(es werden ja mehrere felder übergeben)
Verfasst: Mi 11.Okt, 2006 20:21
von oxpus
Entscheidungshilfe:
Eindimensionale Arrays besitzen einen Key.
Z. B. $lang['Username']
Mehrdimensionale Arrays besitzen mehrere Schlüssel:
$lang['Username']['Realname'] (mal hier ein zweifaches frei erfunden).
Welche Art wird also bei Dir verwendet?
Wenn es ein mehrdimensionales Array ist, mit der Berechnung als ersten Schlüssel, wäre die Sortierung einfach...
Verfasst: Mi 11.Okt, 2006 20:55
von shadowrider
also mehrdimensional:
Code: Alles auswählen
$template->assign_block_vars("Table_InactiveUsers", array(
"ROW_CLASS" => $row_class,
"ROW_CLASS_ALERT" => $row_class_alert,
"NUMBER" => $i +1,
"USERNAME" => $row['username'], usw.
der Schlüssel, nach welchem ich sortieren will, wäre der 7.
Verfasst: Mi 11.Okt, 2006 23:55
von oxpus

?
Nicht die Übergabe an ein Template kann sortiert werden, sondern nur ein Array!
Was "soll" denn nun sortiert werden???
Verfasst: Do 12.Okt, 2006 07:46
von shadowrider
dann wird offenbar Zeile für Zeile bearbeitet und an das Template übergeben?
da müsste ja das ganze völlig anders laufen, vor der Übergabe sammeln und dann sortieren und erst dann an das Template - das ist zu fett für mich, da muss ich wohl die Finger von lassen
oder ist es möglich, direkt nach
$sql = "SELECT....
den gesamten Datensatz zu sortieren?
Verfasst: Do 12.Okt, 2006 08:19
von oxpus
Öh, sofern ein Datensatz gelesen und übergeben wird nicht.
Dann muss wirklich erst alles ausgelesen und dann sortiert werden.
Aber ich kenne ja bislang auch nur ein Bruchstück dessen, was Du da bearbeitest. Vielleicht ist es einfacher, als ich jetzt rätzeln kann, was Du genau willst...
Verfasst: Do 12.Okt, 2006 10:22
von shadowrider
Vielleicht ist es einfacher, als ich jetzt rätzeln kann
nun, ich dachte eigentlich ich hätte es am Anfang sehr genau beschrieben?
(und die Datei mit angehängt)
Verfasst: Do 12.Okt, 2006 13:54
von oxpus
Oh, sorry, komplett übersehen
Also:
Wenn Du
gegen
tauschen würdest, müsste die Sortierung die gewünschte sein.
Denn was macht die Berechnung:
Sie ermittelt ja die Monate vom letzten Login bis jetzt.
Und mit der Berechnung time() - user_lastlogon wird ja auch die Differenz zwischen jetzt und dem letzten Login ermittelt.
Aufsteigend sortiert (ASC) würde der User mit der kürzesten Inaktivität "oben" stehen, bei absteigender Sortierung (DESC), so wie ich das jetzt mal gemacht habe, der mit der längsten Offline-Zeit.
Nach der Abfrage werden dann auch weiter brav die Monate berechnet. Das ist ja dann okay, da die User bereits sortiert vorliegen...
Verfasst: Do 12.Okt, 2006 14:06
von shadowrider
das geht gemeinerweise eben nicht, denn erst bringt er alle User, deren Logon = "" ist, danach sortiert er mir die anderen richtig
(deswegen habe ich ja in meiner Berechnung:
if ($row['user_lastlogon'] == 0) $g = $row['user_regdate'];
weil es sonst gar nicht funktioniert
Verfasst: Do 12.Okt, 2006 14:10
von oxpus
Ach ja. Dann muss noch eine Bedingung rein:
Code: Alles auswählen
AND user_lastlogon <> 0 AND user_lastlogon IS NOT NULL
Dann werden alle "nie" angemeldeten User ausgegrenzt.
Verfasst: Do 12.Okt, 2006 14:17
von shadowrider
die sollen ja nicht ausgegrenzt werden, denn ich möchte bei denen ebenfalls nach inaktiver zeit x eine Erinnerungsmail senden und später rauswerfen - deshalb verwende ich bei Logon "" das Registrierungsdatum, so habe ich auch für diese Leute im Blick wie lange schon 'tote Hose' ist
Verfasst: Do 12.Okt, 2006 14:32
von oxpus
Also die Sortierung erweitern:
Code: Alles auswählen
ORDER BY CASE user_lastlogon WHEN NULL THEN user_regdate ELSE user_lastlogon END DESC
Damit wird eben gesagt, wenn user_lastlogon NULL ist, nimm das user_regdatum und anschliessend wird sortiert.
Sofern ich jetzt keine Tippfehler drinnen habe, sollte das dann gehen und alle User in einer "Linie" sortieren...
Verfasst: Do 12.Okt, 2006 15:27
von shadowrider
ist doch ein Scheibenkleister
vorher war
logon = "" absteigend, dann logon <> "" absteigend
jetzt sortiert er:
logon <> "" aufsteigend, dann logon = "" absteigend
Verfasst: Do 12.Okt, 2006 15:55
von oxpus
Und so?
Code: Alles auswählen
ORDER BY CASE user_lastlogon WHEN NULL THEN user_regdate ELSE user_lastlogon DESC END
Verfasst: Do 12.Okt, 2006 16:00
von shadowrider
ne ne, deine Syntax-Kenntnisse sind schon ok
beim 2 Versuch gibt es einen Syntaxfehler