Verzeichnis rekursiv durchlaufen

Metha

Mitglied
Moin Moin,

hänge jetzt schon seit Stunden vor dem vermeintlich banalem Problem, ein Verzeichnis rekursiv zu durchlaufen.

PHP:
function readdirs($path, $array=NULL)
	{
	$entrys=scandir($path);
	foreach($entrys as $part)
		{
		if(is_dir($path.$part) && preg_match('/^\[t\]_(.+)/i', $part, $hit))
			{
			$array[]=array('path' => $path.$hit[0], 'name' => $path.$hit[1]);
			}
		if(is_dir($path.$part) && !preg_match('/^(.|..)$/i', $part, $hit))
			{
			readdirs($path.$part.'/', $array);
			}
		}
	return($array);
	}

# Funktionsaufruf
$test=readdirs($_SERVER['DOCUMENT_ROOT'].'/');
print_r($test);

Die Funktion soll mir alle Ordner mit den anfangszeichen '[t]_' in ein Array speichern und zurückgeben.

Ich bekomme aber nur immer den ersten Ordner auf den dies zutrifft zurück!

Ich hoffe ich sehe einfach den Wald vor lauter Bäumen nicht?!
Jemand ne Idee wo mein Fehler ist?

Gruß Metha
 
Du verarbeitest ja auch nicht den Rückgabewert des Rekursionsaufrufs weiter. Diesen müsstest du aber mit $array vereinigen.
 
Tut mir leid, ich komme nicht drauf!

Ich komme immer wieder nur auf das selbe Ergebnis wie vorher…
Kannst du mir nen Ansatz schreiben?
 
PHP:
if(is_dir($path.$part) && !preg_match('/^(.|..)$/i', $part, $hit)) 
            { 
            readdirs($path.$part.'/', $array); 
            } 
        }

Schau dir den Textabschnitt mal an, deine readdirs Funktion liefert ein Array zurück, du machst aber nichts mit dem Rückgabewert. Du musst also den Rückgabewert mit dem Array zusammenführen, welches du bereits in deiner readdirs Funktion hast.
 
Ok, wie dumm von mir! Nun läuft die Funktion – und Danke für die Hilfe!

Wen es interessiert:

PHP:
function readdirs($path, $value=NULL)
	{
	$array=array();
	if(is_array($value))
		{$array=array_merge($array, $value);}

	$entrys=scandir($path);
	foreach($entrys as $part)
		{
		if(is_dir($path.$part) && !preg_match('/^(.|..)$/i', $part, $hit))
			{
			if(preg_match('/^\[t\]_(.+)/i', $part, $hit))
				{$array[]=array('path' => $path.$hit[0], 'name' => $path.$hit[1]);}
			$array=readdirs($path.$part.'/', $array);
			}
		}
	return($array);
	}
 
Falls du das Ganze iterativ und nicht rekursiv lösen möchtest:
PHP:
function readdirs($path)
{
	$path = realpath($path);
	if (!$path) {
		return false;
	}
	$stack = array($path);
	$matches = array();
	while ($path = array_pop($stack)) {
		$dh = opendir($path);
		while ($file = readdir($dh)) {
			if ($file == '.' || $file == '..') {
				continue;
			}
			if (is_dir($path.'/'.$file)) {
				if (preg_match('/^\[t\]_(.+)/i', $file, $match)) {
					$matches[] = array(
						'path' => $path.'/'.$file,
						'name' => $path.'/'.$file,
					);
				}
				array_push($stack, $path.'/'.$file);
			}
		}
	}
	return $matches;
}
 
Zurück