Mailinglisten-Archive |
Hier ist der Source (ich schreibe ein Msg-Board, dass auf TEXT-Dateien basiert. hat nen Grund) Die Datei "daten" sieht wie folgt aus: 1|5,6|1|Thread 1|bla|903806240| 2|3,4|2|Thread 2|bla|903806245| 3| |2|Re: Thread 2 - 1. Antwort|Alex|903806271| 4| |2|Re: Thread 2 - 2. Antwort|Alex|903806279| 5|7|1|Re: Thread 1 - 1. Antwort|Alexo|903806303| 6| |1|Re: Thread 1 - 2. Antwort|Alexo|903806309| 7| |1|Re: Thread 1 - 1. Antwort - 1. Ant|asdf|903806420| Wobei das 1. Feld: Nummber der Nachricht 2. Feld: Die Antworten auf die Nachricht 3. Die Nummer der Ausgangsnachricht dieses Threades 4. Feld Das Subject 5. Feld den Autor und das 6. Feld die Posting-Zeit since Epoch ist. hier ist die Datei, die die Daten indizieren soll: <ul> <? // file with the msg-data $f_data = "./daten"; // directory with msg-files $f_dir = "msg/"; // How old shall the msgs to be shown be (uncomment this line and give a // parameter to the script to let the user say it himself) $show_days = 30000; // erstmal testweise gesetzt, funktiniert aber // Message-Extension $f_ext = "php3"; // XXXXXXXXXXXXXxXXXXxXXXXxXXXXxXXXXxXXXXx // Now read from the data-file EVERY msg-line! // (This is, because it shall also show old threads with new msgs! $fp_data = fopen($f_data,"r"); $tmp = fgets($fp_data,2000); $number_messages = 0; while ( $tmp != "" ) { $number_messages++; $split = strtok($tmp,"|"); $ccount = 0; while($split) { $msg_line[$ccount] = $split; $split = strtok("|"); $ccount++; } $msg_answers[$msg_line[0]] = $msg_line[1]; $msg_top[$msg_line[0]] = $msg_line[2]; $msg_subject[$msg_line[0]] = $msg_line[3]; $msg_author[$msg_line[0]] = $msg_line[4]; $msg_date[$msg_line[0]] = $msg_line[5]; $tmp = fgets($fp_data,2000); } fclose($fp_data); // Now we have the dates of every msg in a big array. // This one we check for relevance. If the msg is good, // we take the mainthread of the msg (saved in _top) and // add the mainthread into the list of relevant threads. $count = 0; While ($count < $number_messages +1) { $cur_date = date("U"); // The day has 3600*24 seconds if ( ( ( $cur_date - $msg_date[$count]) % 3600 ) % 24 <= $show_days ): $valid[] = $msg_top[$count]; echo $msg_top[$count]; endif; $count++; } // Sort Main-Threads // sort($valid); // Warum klappt das eigentlich nicht? Versteh ich echt nicht. // Auf jeden Fall muss ich diese Zeile auskommentieren. Weiss jemand, warum? // Now Show all threads that are valid, do this recursive, paste the html-code function maketree ( $number ) { global $msg_answers, $msg_subject, $msg_author; global $msg_date, $f_ext, $f_dir; $tmp_html = $tmp_html . "\n" . "\t<li><b><a href=\"" . $f_dir . $number . "." . $f_ext . "\">" . $msg_subject[$number] . "</a></b><b> " . $msg_author[$number] . " </b><i> " . date("M d, Y",$msg_date[$number]) . " </i>\n"; if ($msg_answers[$number] != " "): $tmp_html = $tmp_html . "\n<ul>\n"; $split = strtok($msg_answers[$number],","); while($split) { $trees[] = $split; $split = strtok(","); } $t_count = 0; while ($t_count < sizeof($trees)+1) { $tmp_html = $tmp_html . maketree($trees[$t_count]); $t_count++; } $tmp_html = $tmp_html . "\n</ul>\n"; endif; return $tmp_html; } // Add every thread to the html-code. change newer=upper or newer=lower by changing the sort-method! $count = 0; $number = sizeof($msg_date); while ($count < $number +1) { if ( ($valid[$count] != 0) and ($valid[$count-1] != $valid[$count]) ): echo maketree($valid[$count]) . "</li>"; endif; $count++; } ?> Das ganze funktioniert soweit. Waere da nicht der Stack-Overflow. Ich verstehe das nicht :( Wie ihr seht, wird Maketree also rekursiv aufgerufen. Dies ist ganz sinnvoll, weil jede Nachricht fuer sich kucken kann, ob sie Antworten hat. Danke fuer Eure Hilfe! Alex
php::bar PHP Wiki - Listenarchive