Ordnerstruktur richtig auslesen

low-group

Erfahrenes Mitglied
Hallo,

ich stehe vor ein Problem beim auslesen einer Ordnerstruktur. Ich will diese auslesen und diverse Daten in die DB schreiben.

also in die DB kommen soll:

ID | Ordnername | re_id | path

Die Ordnerstruktur kann beliebig tief sein.

z.b.

|- Ordner1
|-|-Ordner11
|-|-Ordner12
|-|-|-Ordner121
|-|-|-Ordner122
|-|-Ordner13
|-Ordner2

in der DB sollte das dann so aussehn:

1 | Ordner1 | 0 | "|"
2 | Ordner11 | 1 | "|1|"
3 | Ordner12 | 1 | "|1|"
4 | Ordner121 | 3 | "|1|3|"
5 | Ordner122 | 3 | "|1|3|"
6 | Ordner13 | 1 | "|1|"
7 | Ordner2 | 0 | "|"

u.s.w.

Jeder Ordner hat erstmal eine eindeutige ID, welche aus der DB durch autoincrement kommt.

Nun muß ein Unterordner bei re_id die ID des übergeordneten Ordner rein.
In den Ordner liegen wiederum Dateien, welche die ID des aktuellen Ordners brauchen, in dem sie drinne liegen.

Jetzt habe ich das ganze erstmal per echo ausgegeben, bevor ich es in die DB schreibe und da haut es schon nicht hin.

hier mal mein Script:

PHP:
$dir = "files";


getDirectoryTree( $dir, 15, 0 );


function getDirectoryTree( $outerDir , $c , $t){ 


    $dirs = array_diff( scandir( $outerDir, 1 ), Array( ".", ".." ) ); 
    $dir_array = Array(); 

    foreach( $dirs as $key => $d ){ 
        if( is_dir($outerDir."/".$d) ){
		$c++;
		if($t == 0) $t = ""; else $t = "|".$t;
		echo "<br />&nbsp;" .$t. "|".$c . "| - <b>" . $d . "</b><br />\n";
		$dir_array[ $d ] = getDirectoryTree( $outerDir."/".$d, $c, $c);

	} 

        else{
		$dir_array[ $d ] = $d; 
		#if($c == 0) $c = "";
		echo "&nbsp;&nbsp;&nbsp;&nbsp;". $c. " - " . $d . "<br />\n";
	}

    } 


    return $dir_array; 
}

und hier die ausgabe dazu: http://roadster-sportwagen.eu/files.php

wie man sieht, haut es mit den OrdnerIDs nicht so richtig hin. kann mir da eventl. jemand behilflich sein?
 
Schau dir mal den DirectoryIterator aus der SPL (Standard PHP Library) an. Die SPL ist eigentlich immer mitinstalliert bei PHP. Dann wird der Quellcode übersichtlicher!

Zu deinem Problem würdi ch gerne was schreiben, aber könntest du mir erstmal den gefallen tun, und die wirklich miesen Variablennamen wie $d und $c durch sinnvolle Namen auszutauschen? Ich will nicht dauernd überlegen müssen, was $c denn nun gewesen ist ...

Kannst du die Ausgabe mal mit folgendem Code machen:
PHP:
$tree = getDirectoryTree( $dir, 15, 0 );

echo '<pre>';
var_dump($tree);
echo '</pre>';
Du schaust da nämlich bissl falsch rein, mit deinem echo zwischendurch ! Zuerstmal sollte man sichergehen, wie das Array aufgebaut ist bevor man sich um die Ausgabe kümmert!
 
Da seh ich ja schonmal nen Problem: du verwendest keine nummerischen Keys. Warum nicht? Das würde doch viel Arbeit ersprachen! Du hast immer ja immer den selben String als Key und Value! Zudem hilft es, wenn man die nächste Ebene immer als Array an den Key "children" hängt, mal so als Beispiel.
 
hmm...
habe es jetzt so:
PHP:
function getDirectoryTree( $outerDir ){ 
    $dirs = array_diff( scandir( $outerDir ), Array( ".", ".." ) ); 
    $dir_array = Array(); 
    foreach( $dirs as $key => $d ){ 
        if( is_dir($outerDir."/".$d) ) $dir_array[ $key ] = getDirectoryTree( $outerDir."/".$d ); 
        else $dir_array[ $key ] = $d; 
    } 
    return $dir_array; 
}
siehe: http://roadster-sportwagen.eu/files2.php
 
Wo ist das Problem?
Soll die ID fortlaufen selbst in der Tiefe des Arrays?

Dann änder den return in:
PHP:
return array($dir_array, $key);

Und arbeite damit erst einmal ein bisschen. Den zurückgegebenen Key verwendest du rekursiv so, dass die Zahl zur "ID" addiert wird.

Du kanns auch bestimmt mit dem RecursiveDirectoryIterator irgendwie arbeiten:
PHP:
$path = realpath('.');
$dir = new RecursiveDirectoryIterator($path);
echo $dir->getChildren()->current();
$dir->getChildren()->next();
echo $dir->getChildren()->current();

Da kann man sehr schön prüfen ob es überhaupt ein Verzeichnis ist:
DirectoryIterator::isDir
DirectoryIterator::isDot
 
Zuletzt bearbeitet:
Zurück