Rekursive Programmierung

Neurodeamon

Erfahrenes Mitglied
So, jetzt brauche ich selbst mal Hilfe :)

Problem:
Verzeichnisse sowie ALLE Unterverzeichnisse (sowie deren... usw) auslesen.

Script:
Das ganze klappt ganz gut, wenn man es nur per print oder echo ausgeben möchte:

PHP:
<?php
$basedir = ".";
// functions
function listdir($basedir){
	if ($handle = @opendir($basedir)) {
		while (false !== ($dir = readdir($handle)))
		{
			if ($dir == '.' || $dir == '..'){
			} else {
				if (is_dir($basedir."/".$dir)){
					echo $basedir."/".$dir."<br>";
					listdir($basedir."/".$dir);
				}
			}
		}
		closedir($handle);
	}
}
listdir($basedir);
?>

Möchte man das ganze jetzt in ein Array bekommen wird das ganze schon schwieriger. Ich habe im Moment einen Aussetzer und hab alle möglichen und unmöglichen Konstrukte ausprobiert ...

Das Problem ist wohl das jeder rekursive Aufruf vorhandene Arrays löscht und neu anlegt (vermute ich mal). Ich habe auch schon versucht ein mehrdimensionales Array zu bilden, aber das scheitert auch. Argh!

*brain suspend, overheating protection*

Wäre für Denkanstösse / Beispiele dankbar :)

Greetz,
Neuro
 
Du musst dein Array vor
dem aufruf der Funktion
builden. An die Funktion übergeben, auch beim rekursieven aufruf an die funktion übergeben.

Wobei ich dann eine Referenz auf dein Array übergeben würde nicht dein array selber.

function listdir($basedir,$arr){
...

listdir(...,&$arr);
 
Cool, Danke!!! An "passing by reference" habe ich gar nicht gedacht. Grrr, ich hatte es schon richtig, nur ohne das kleine unscheinbare &... :)

Hier für alle, die diese Funktion möglicherweise mal brauchen:

PHP:
<?php
$basedir = ".";
// functions
function listdir($basedir,&$a_dir){
	if ($handle = @opendir($basedir)) {
		while (false !== ($dir = readdir($handle)))
		{
			if ($dir == '.' || $dir == '..'){
			} else {
				if (is_dir($basedir."/".$dir)){
					echo $basedir."/".$dir."<br>";
					$a_dir[] = $basedir."/".$dir;
					listdir($basedir."/".$dir,$a_dir);
				}
			}
		}
		closedir($handle);
	}
	return $a_dir;
}
listdir($basedir,$a_dir);
print_r($a_dir);
?>

Das reference Symbol muss übrigens nur in der Funktion definiert werden. Wenn ich die Info bei php.net richtig verstanden habe, wird alles andere irgendwann aus php rausfliegen. Kann man ja gleich für die Zukunft lernen :p

HolyFly, ich könnte Dich küssen :))
 
Noch eine Möglichkeit bzw. weil ich nix zu tun hab ..

meine Collector Klasse für euch ..

etwas kompliziert geschrieben, manchmal
langsam und schön konfigurierbar :
 

Anhänge

  • class_file_collector.inc.zip
    1,5 KB · Aufrufe: 48

Neue Beiträge

Zurück