Heren, dames,
Ik ben een (simpel) threaded forumpje aan het schrijven en loop tegen het volgende aan:
Ik heb een procedure geschreven die uit een database de top-posts haalt en dan per post kijkt of er reacties op zijn en dan of daar weer reacties op zijn (etc). Als er geen reactie is, dan gaat hij weer 1 niveau hoger kijken en als daar niets meer te halen valt weer 1 hoger totdat we weer op top-niveau zijn. Daar opent hij de volgende top-post en herhaalt bovenstaand kunstje.
Dit werkt goed, maar... Er wordt per reply een query uitgevoerd, wat uiteindelijk performance gaat kosten.
Ik zat te denken om alle posts die in 1 thread staan in 1 array te gooien en dan intern in die array te gaan bepalen wat de volgorde en niveau van de post is. Dit wordt alleen iets te moeilijk voor dit amateurtje...
Op http://sait.nl/threaded.php kun je zien wat ik bedoel. Threads v1 is de werkende versie en v2 werkt niet (maar is al wel sneller!).
Ik heb dus deze array om te sorteren en 'levels' toe te voegen:
$array['threadnr']['id' en 'reply_op_id' en 'inhoud']
dus zoiets:
$array[1]: id=1 parent=0 (top post)
$array[1]: id=2 parent=1 (antwoord op id1)
$array[1]: id=3 parent=1 (weer een antwoord op id1)
$array[1]: id=4 parent=2 (antwoord op id2)
moet worden:
id1
|--id2
|--|--id4
|--id3
pfff... ik ben benieuwd of hier iemand pindakaas van kan maken.
Cheers!
De 'oude' manier:
Ik ben een (simpel) threaded forumpje aan het schrijven en loop tegen het volgende aan:
Ik heb een procedure geschreven die uit een database de top-posts haalt en dan per post kijkt of er reacties op zijn en dan of daar weer reacties op zijn (etc). Als er geen reactie is, dan gaat hij weer 1 niveau hoger kijken en als daar niets meer te halen valt weer 1 hoger totdat we weer op top-niveau zijn. Daar opent hij de volgende top-post en herhaalt bovenstaand kunstje.
Dit werkt goed, maar... Er wordt per reply een query uitgevoerd, wat uiteindelijk performance gaat kosten.
Ik zat te denken om alle posts die in 1 thread staan in 1 array te gooien en dan intern in die array te gaan bepalen wat de volgorde en niveau van de post is. Dit wordt alleen iets te moeilijk voor dit amateurtje...
Op http://sait.nl/threaded.php kun je zien wat ik bedoel. Threads v1 is de werkende versie en v2 werkt niet (maar is al wel sneller!).
Ik heb dus deze array om te sorteren en 'levels' toe te voegen:
$array['threadnr']['id' en 'reply_op_id' en 'inhoud']
dus zoiets:
$array[1]: id=1 parent=0 (top post)
$array[1]: id=2 parent=1 (antwoord op id1)
$array[1]: id=3 parent=1 (weer een antwoord op id1)
$array[1]: id=4 parent=2 (antwoord op id2)
moet worden:
id1
|--id2
|--|--id4
|--id3
pfff... ik ben benieuwd of hier iemand pindakaas van kan maken.

Cheers!
De 'oude' manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| $RESULT[0]=dbQuery("SELECT * FROM nested WHERE parent=0"); while ($ARRAY[0]=mysql_fetch_array($RESULT[0])) { // zolang er top-posts zijn echo "Post id: ".$ARRAY[0]['id']." \"".$ARRAY[0]['text']."\"<br>"; // echo de top-post $LEVEL=1; while (1) { $RESULT[$LEVEL]=dbQuery("SELECT * FROM nested WHERE parent=".$ARRAY[$LEVEL-1]['id']); // selecteer alle leafs van de post while (1) { // zolang er items zijn in de huidige level $ARRAY[$LEVEL]=mysql_fetch_array($RESULT[$LEVEL]); $AANTAL[$LEVEL]=mysql_num_rows($RESULT[$LEVEL]); (!isset($TELLER[$LEVEL])) ? $TELLER[$LEVEL]=1 : $TELLER[$LEVEL]++; if ($TELLER[$LEVEL]<=$AANTAL[$LEVEL]) { echo createPost($LEVEL,$ARRAY[$LEVEL]); $RESULT[$LEVEL+1]=dbQuery("SELECT * FROM nested WHERE parent=".$ARRAY[$LEVEL]['id']); // controleer of de post een kind heeft if (mysql_num_rows($RESULT[$LEVEL+1])>0) { //zijn er kinderen? $LEVEL++; //ga er dan naar toe } } else $LEVEL--; if ($LEVEL<1) break; } unset($TELLER); if ($LEVEL<1) break; } echo "<br>"; } |
[ Voor 46% gewijzigd door haling op 14-06-2006 15:01 . Reden: extra info ]