phpbar.de logo

Mailinglisten-Archive

Re: [php] Seltsamer Stack-Overflow (?)
Archiv Mailingliste php_(at)_infosoc.uni-koeln.de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [php] Seltsamer Stack-Overflow (?)



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

Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive