Hallo,
zunächst einmal: ich bin natürlich verrückt
weil ich selber ein PHP-Forum programmiert habe.
(gibt ja erst 2500 davon)
Ok, aber nun ist es soweit fertig, nur manchmal etwas
langsam, wenn sehr viele Threads zu sortieren sind.
Nun die Frage: Kann man unterstehende Routine
verbessern/optimieren?
Beschreibung:
zuerst wird das ergebnis ($result) datensatzweise in ein array $arr_topics kopiert. Dann wird gesucht, ob es zu den threads Antworten neueren datums gibt.
Es soll so sortiert werden: "1. Einträge mit Wert STICKED" Danach alle Datensätze nach Datum des Posts ODER neuem Datum einer Antwort.
Wahrscheinlich kann/will sich da aber keiner reindenken.
Wie gesagt, unten stehender Auszug funktioniert, ist nur ziemlich langsam wegen der vielen queries.
..... ($result ist eine erste MySQL-Abfrage mit allen Sätzen)
......
$num_topics=0;
// Here begins main output loop
while ($arr = mysql_fetch_array($result))
{
$arr_topics[]=$arr;
$num_topics++;
}
for ( $i=0 ; $i < $num_topics ; $i++)
{
$id=$arr_topics[$i]["id"];
$sqlx="SELECT date,replyid,id FROM $table WHERE replyid='$id' ORDER BY date DESC";
$resx=mysql_query($sqlx);
if ($resx)
{
$rowx=mysql_fetch_row($resx);
$rdate=$rowx[0];
if ($rdate) $arr_topics[$i]["newdate"]=$rdate;
else $arr_topics[$i]["newdate"]=$arr_topics[$i]["date"];
}
}
// usort($arr_topics,"sticked");
// sort order
// 1. sticked - date
// 2. newest posts (parent=Y) - date
// 3. older posts with new replies (parent=N) - date
// 4. rest - date
// Array [id, replyid, date, sticked]
reset($arr_topics);
usort ($arr_topics, "cmp");
reset($arr_topics);
function cmp($a, $b)
{
if ($a['sticked'] == 'Y') return -1;
if ($b['sticked'] == 'Y') return 1;
if ($a['newdate'] == $b['newdate']) return 0; //same
return ($a['newdate'] < $b['newdate'])?1:-1; // only by date
}
-------
Ideen wie ich das besser machen kann?
zunächst einmal: ich bin natürlich verrückt
weil ich selber ein PHP-Forum programmiert habe.
(gibt ja erst 2500 davon)
Ok, aber nun ist es soweit fertig, nur manchmal etwas
langsam, wenn sehr viele Threads zu sortieren sind.
Nun die Frage: Kann man unterstehende Routine
verbessern/optimieren?
Beschreibung:
zuerst wird das ergebnis ($result) datensatzweise in ein array $arr_topics kopiert. Dann wird gesucht, ob es zu den threads Antworten neueren datums gibt.
Es soll so sortiert werden: "1. Einträge mit Wert STICKED" Danach alle Datensätze nach Datum des Posts ODER neuem Datum einer Antwort.
Wahrscheinlich kann/will sich da aber keiner reindenken.
Wie gesagt, unten stehender Auszug funktioniert, ist nur ziemlich langsam wegen der vielen queries.
..... ($result ist eine erste MySQL-Abfrage mit allen Sätzen)
......
$num_topics=0;
// Here begins main output loop
while ($arr = mysql_fetch_array($result))
{
$arr_topics[]=$arr;
$num_topics++;
}
for ( $i=0 ; $i < $num_topics ; $i++)
{
$id=$arr_topics[$i]["id"];
$sqlx="SELECT date,replyid,id FROM $table WHERE replyid='$id' ORDER BY date DESC";
$resx=mysql_query($sqlx);
if ($resx)
{
$rowx=mysql_fetch_row($resx);
$rdate=$rowx[0];
if ($rdate) $arr_topics[$i]["newdate"]=$rdate;
else $arr_topics[$i]["newdate"]=$arr_topics[$i]["date"];
}
}
// usort($arr_topics,"sticked");
// sort order
// 1. sticked - date
// 2. newest posts (parent=Y) - date
// 3. older posts with new replies (parent=N) - date
// 4. rest - date
// Array [id, replyid, date, sticked]
reset($arr_topics);
usort ($arr_topics, "cmp");
reset($arr_topics);
function cmp($a, $b)
{
if ($a['sticked'] == 'Y') return -1;
if ($b['sticked'] == 'Y') return 1;
if ($a['newdate'] == $b['newdate']) return 0; //same
return ($a['newdate'] < $b['newdate'])?1:-1; // only by date
}
-------
Ideen wie ich das besser machen kann?
Kommentar