[php] Verzeichnislisting Rekursiv

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Hallo ich möchte gerne Alle ordner mit unterordner in einem Dropdown Feld ausgeben. Die Funktion um ein Ordner zu Listen habe ich. In eine Dropdown würde ich das auch bekommen aber mit "NUR" Ordner und rekursiv bin ich wohl überfordert. Hat da jemand was Parat?

PHP:
<?php
   $verz=opendir ('.');
   while ($file = readdir ($verz)) {
      if($file != "." && $file != ".." == "dir")
         echo $file."<br>";
   }
   closedir($verz);
?>
 
blubb - du hast doch schon alles selber gesagt, was man wissen muss - jetzt musst du es nur noch in programmcode fassen.

Achtung - nur kurz runtergeschrieben - nicht getestet ;)
PHP:
/**
 * @param string $pfad Ordnername (kein / am Ende!)
 * @param int $tiefe Wieviele ebenen im VerzBaum sollen angezeigt werden, -1 für alle
 */
function html_options_directory_recursive($pfad=".", $indent="--", $tiefe=-1) {
    # Terminierung, falls gewünschte Tiefe im Verz.Baum erreicht
    if($tiefe == 0) return;

    $dir = opendir($pfad);
    if(!$dir) exit("Fehler beim öffnen des Verz. $pfad");

    while (($file = readdir ($dir))!== false) { 
         if($file != '.' && $file != '..') {
            if(is_dir($file)) {
                echo "\n<option value=".htmlentities($pfad.'/'.$file).">$indent ".htmlentities($file)."</option>";
                html_options_directory_recursive($pfad.'/'.$file,$indent.$indent,$tiefe-1);
            }
        }
    }
    closedir($dir);
}

Edit: Closedir vergessen ;)

Edit2: Sei bitte Vorsichtig beim Auswerten des Formulars. Wenn ein Benutzer einen Request fäscht und ein falsches Verzeichnis übergibt, kann er eventuell etwas unbeabsichtiges können. Also überprüf die Variable des Pfads doppelt und dreifach
 
Zuletzt bearbeitet:
Vielleicht mache ich auch was falsch aber es kommt irgendwie immer

Warning: readdir(): supplied argument is not a valid Directory resource in verzeichnis.php on line 13

Weil es sollte ja so schon funktionieren oder : html_options_directory_recursive();
 
Zuletzt bearbeitet:
Der Zend artikel verwirrt mich mal toootal! :(


weil damit bekomme ich das auch nicht hin. Er gibt dort dann auch nicht Rekursiv aus :(
 
Zuletzt bearbeitet:
Hmmm - kleiner Fehler ist drin - aber die Fehlermeldung weist darauf hin:
Code:
    while (($file = readdir ($dir))!== false) {

Statt $verz muss ein $dir rein.
 
soweit so gut. Also das listing geht. Aber leider nicht Rekursiv :(
ich habe die Funktion einfach aufgerufen. Und dann sollte es ja von dem Verzeichnis des Scriptes aus alle unterverzeichnisse auflisten oder?

Ergebnis:
Code:
dir1
dir2
dir3
Aber in Jedem der Verzeichnisse sind noch unterverzeichnisse :(

Die Aktuelle Funktion:

PHP:
/**
 * @param string $pfad Ordnername (kein / am Ende!)
 * @param int $tiefe Wieviele ebenen im VerzBaum sollen angezeigt werden, -1 für alle
 */
function html_options_directory_recursive($pfad=".", $indent="", $tiefe=-1) {
	$listing ="<select name=\"select\">";

    # Terminierung, falls gewünschte Tiefe im Verz.Baum erreicht
    if($tiefe == 0) return;

    $dir = opendir($pfad);
    if(!$dir) exit("Fehler beim öffnen des Verz. $pfad");

    while (($file = readdir ($dir))!== false) { 
         if($file != '.' && $file != '..') {
            if(is_dir($file)) {
                $listing .= "\n<option value=".htmlentities($pfad.'/'.$file).">$indent ".htmlentities($file)."</option>";
                html_options_directory_recursive($pfad.'/'.$file,$indent.$indent,$tiefe-1);
            }
        }
    }
    closedir($dir);

	$listing .="</select>";

	return $listing;
}  

echo html_options_directory_recursive(".");

Und das ist meine Verzeichnisstruktur:
Code:
dir1
dir2
dir3
dir1\1
dir1\1\weq
dir2\2
dir2\2\hgf
dir3\NeuerOrdner
dir3\NeuerOrdner\NeuerOrdner2

Und genauso hätte ich das gerne in dem Dropdown :(. Weil das soll so ein Verzeichnisauswahlscript für den Uploadpfad werden.
 
Zuletzt bearbeitet:
Dann zitiere ich einfach mal aus dem wenig hilfreichen Zend-Text ;)

<?php

//a simple file tree traversal - takes in a path and returns a nested array

$delim = strstr(PHP_OS, "WIN") ? "\\" : "/";

function
retrieveTree($path) {
global
$delim;

if (
$dir=@opendir($path)) {
while ((
$element=readdir($dir))!== false) {
if (
is_dir($path.$delim.$element) && $element!= "." && $element!= "..") {
$array[$element] = retrieveTree($path.$delim.$element);
} elseif (
$element!= "." && $element!= "..") {
$array[] = $element;
}
}
closedir($dir);
}
return (isset(
$array) ? $array : false);
}

?>


Assuming the following file structure:
foo
foo/bar
foo/baz
foo/baz/bop
foo/baz/bop/file4.txt
foo/baz/file2.txt
foo/baz/file3.txt
foo/file1.txt
a call to: print_r(retrieveTree('foo'));
will yield the result:
Array
(
[bar] =>
[baz] => Array
(
[bop] => Array
(
[0] => file4.txt
)

[0] => file2.txt
[1] => file3.txt
)

[0] => file1.txt
)
 
Ja Aber ich habe damit rumprobiert.. wollte das ich nur die Verzeichnisse ausgegegeben bekomme. Und die Funktion hat mich total verwirrt. Hatte auch probiert das in ein Select zu bekommen aber ging irgendwie nicht.
 
PHP:
<pre><?php

//a simple file tree traversal - takes in a path and returns a nested array

$delim = strstr(PHP_OS, "WIN") ? "\\" : "/";

function retrieveTree($path) {
	global $delim;
	if ($dir=@opendir($path)) {
		while (($element=readdir($dir))!== false) {
			if (is_dir($path.$delim.$element) && $element!= "." && $element!= "..") {
				$array[$element] = retrieveTree($path.$delim.$element);
				// Hier <option> einbauen (Ordner)
			} elseif ($element!= "." && $element!= "..") {
				$array[] = $element;
				// Hier <option> einbauen (Datei)
			}
		}
		closedir($dir);
	}
	return (isset($array) ? $array : false);
}

$array = retrieveTree("photosets");

print_r($array);

?></pre>
 
Sollte ich das <option> in die selber Variable schrieben und in das Array oder einfach echon? weil würde ja schon gerne das dann so haben das ich den "kompletten" pfad dort drinstehen habe also "dir1/ordner/test" usw.
 
edit: So ich habs dann doch mal getestet ... tut eignetlich einwandfrei ...

Dein Fehler war, eine Variable rekursiv füllen wolltest ;) ($listing) ... das geht so nicht :(
PHP:
<?php
define("DS",strstr(PHP_OS, "WIN") ? "\\" : "/");

/**
 * @param string $pfad Ordnername (kein / am Ende!)
 * @param int $tiefe Wieviele ebenen im VerzBaum sollen angezeigt werden, -1 für alle
 */
function html_options_directory_recursive($pfad=".", $indent="-", $tiefe=-1) {
//echo "".$pfad."<br>";

    # Terminierung, falls gewünschte Tiefe im Verz.Baum erreicht
    if($tiefe == 0) return;

    $dir = opendir($pfad);
    if(!$dir) exit("Fehler beim öffnen des Verz. $pfad");

    while (($file = readdir ($dir))!== false) { 
         if($file{0} != '.') {
            if(is_dir($pfad.DS.$file)) {
                echo "\n<option value=".htmlentities($pfad.DS.$file).">$indent ".htmlentities($file)."</option>";
                html_options_directory_recursive($pfad.DS.$file,$indent.$indent{0},$tiefe-1);
            }
        }
    }
    closedir($dir);
}  
?>
<select>
<?php
html_options_directory_recursive(".");  
?>
</select>

Nachtrag - hier noch als Funktion mit Rückgabewert:
PHP:
<?php
/**
 * @param string $pfad Ordnername (kein / am Ende!)
 * @param int $tiefe Wieviele ebenen im VerzBaum sollen angezeigt werden, -1 für alle
 */
function html_options_directory_recursive_string($pfad=".", $indent="-", $tiefe=-1) {
    $optionsString = "";
    # Terminierung, falls gewünschte Tiefe im Verz.Baum erreicht
    if($tiefe == 0) return;

    $dir = opendir($pfad);
    if(!$dir) exit("Fehler beim öffnen des Verz. $pfad");

    while (($file = readdir ($dir))!== false) { 
         if($file{0} != '.') {
            if(is_dir($pfad.DS.$file)) {
                $optionsString .= "\n<option value=".htmlentities($pfad.DS.$file).">$indent ".htmlentities($file)."</option>";
                $optionsString .= html_options_directory_recursive_string($pfad.DS.$file,$indent.$indent{0},$tiefe-1);
            }
        }
    }
    closedir($dir);
    
    return $optionsString;
}

$listing1 = '<select>'.html_options_directory_recursive_string("phpMyAdmin-2.6.4-pl3").'</select>';
$listing2 = '<select>'.html_options_directory_recursive_string("eve").'</select>';

echo $listing1,$listing2;
?>
 
Zuletzt bearbeitet:
Enigma. Das script listet aber leidere trotzdem nicht rekursiv :(
 
So habe meine funktion von oben soweit fertig.
Aber ich brauche nun noch die Strukturierung auf eine verzeichnisebene :( habe schon alles probiert :(

PHP:
function readdirectory($directory,$subs="1") 
{
$dir = dir($directory);
    while($file = $dir->read())
	{
        if($file !== '.' && $file !== '..') 
		{
            if(is_dir($directory.'/'.$file))
			{
				echo $file.'/<br />';
				if($subs =="1")
				{
				readdirectory($directory.'/'.$file,$subs);
				}
			}
        }
    }
}

readdirectory('./');
 
Tut mein Script bei dir immer noch nicht? Ich hab das wie gesagt bei mir getestet, und das muss funktionieren ;)
 
grml irgendwie ja nicht :(
Ist immer Leer :(
 
Zuletzt bearbeitet:
Kannst mich gern mal im ICQ anlabern, denn hier zu Chatten ist etwas mühselig ;)

Edit: Ergebnis: Es tut so wies dasteht ;) Keine Ahnung warum das davor nicht funktioniert hat.
 
Zuletzt bearbeitet:
Zurück
Oben