Verzeichnis "relativ" auslesen.

P

PbPi

Tag ihr Programmieren und Tutorier.
Mal vorweg: Ich erwarte nicht, dass ihr mir was schreibt oder so, sondern ich brauch nur einen kleinen Ansatz.

Ich möchte ein Verzeichnis "relativ" auslesen. Ich habe es schon geschafft, alle Ordner in einem festgelegten Verzeichnis aufzulisten. Jetzt will ich, dass ein Verzeichnis aus dem Get oder etwas ähnlichem ausgelesen wird. Ich stelle mir das folgendermaßen vor:

- index.php [in dieser seite wird ALLES aufgelistet]
- ordner 1
-- ordner 2
--- ordner 3
-- ordner 4
-- ordner 5

Als erstes werden die Ordner im Hauptverzeichnis aufgelistet. Wenn ich dann "Ordner 1" in der Liste anklicke, sollen die Ordner 2, 4 und 5 in der gleichen Datei, also index.php aufgelistet werden. Wie kann ich sowas machen?

Einen schönen Abend noch und ich hoffe, dass mir so eine Frage (ohne Codeansatz o.ä.) sinnvoll beantwortet wird :)

Der PbPi
 
Das ist leicht zu lösen: du musst einfach ermitteln, ob das gefundene Objekt im Verzeichnis eine Datei oder auch ein Verzeichnis ist. Falls es eine Datei ist, nimmst du diese in die Liste auf, ansonsten verarbeitest du den Verzeichnisnamen rekursiv, also übergibst ihn wieder an die aufrufende Funktion, welche dann wieder dieses Verzeichnis nach Dateien und Verzeichnissen durchsucht. Kurzum: Datei-/Verzeichnisprüfen und Rekursion.
 
Wie es scheint, habe ich meine Frage etwas schlecht formuliert. Ich möchte, dass immer nur ein Verzeichnis angezeigt wird. Dir Unterverzeichnisse werden nicht als Verzeichnisbaum, sondern als einfache Links angezeigt. Wenn ich so einen Link anklicke, kommt man in dieses Verzeichnis. Noch ein Beispiel:

Überschrift: Ordner 1

- Ordner 2
- Ordner 3 [wird angeklickt]
- Ordner 4

==>

Überschrift: Ordner 3

- Ordner 5
- Ordner 6

Das alles soll in einer Datei ablaufen.
 
Was heisst in einer Datei ablaufen? Ist der Tree in einer Text-Datei oder xml-Datei gespeichert?
In welcher Art willst du diese speichern?
 
Hab da mal ein kleines Beispiel geschrieben wie ich es umsetzen würde
PHP:
<?php 
/**
 * Testdaten
 */
//Testdatendefinition
$keyArray = array('master', 'title');

//Testdaten (jeder node ist von der Struktur array(masterId, titel)
$nodes[0] = array(-1, 'home');
$nodes[1] = array(0, 'Ordner 1');
$nodes[2] = array(0, 'Ordner 2');
$nodes[3] = array(1, 'Ordner 1_3');
$nodes[4] = array(1, 'Ordner 1_4');
$nodes[5] = array(2, 'Ordner 2_5');
$nodes[6] = array(2, 'Ordner 2_6');
$nodes[7] = array(3, 'Ordner 1_3_7');
$nodes[8] = array(3, 'Ordner 1_3_8');

//Alle Nodes mit keys versehen (ich finde beim Zugriff auf arrays sind Keys besser lesbar: $node[1] -> $node['title'])
array_walk($nodes, create_function('&$node, $key, $keyArray', '$node = array_combine($keyArray, $node);'), $keyArray);

/**
 * Tree Calculation
 */
//id ermitteln
$id = (isset($_GET['id'])) ? $_GET['id'] : 0;

// Aktueller Node ermitteln
$node = $nodes[$id];

//Kinder-Nodes ermitteln
$childs = array_filter($nodes, create_function('$node', "return \$node['master'] == {$id};"));


/**
 * Ausgabe
 */
$url = $_SERVER['PHP_SELF'];
//Titel ausgeben
echo "<b>{$node['title']}</b><br/>";
//Back-Link zum nächst höheren Node ausgeben
if($node['master'] >= 0) echo "-- <a href='{$url}?id={$node['master']}'>..</a><br/>";
//Pro child ein Link erstellen
foreach($childs as $nid => $node){
    echo "-- <a href='{$url}?id={$nid}'>{$node['title']}</a><br/>";
}


?>
 
Guten Morgen. Der Baum ist weder gespeichert, noch soll er gespeichert werden. Es sollen einfach alle Unterverzeichnisse von der index.php im Hauptverzeichnis ausgelesen werden können. Jedoch wie in Post 2 von mir geschrieben nicht zur gleichen Zeit, sondern nur dann, wenn man das entsprechende Verzeichnis anklickt.

Das

Überschrift: Ordner 1

- Ordner 2
- Ordner 3 [wird angeklickt]
- Ordner 4

==>

Überschrift: Ordner 3

- Ordner 5
- Ordner 6

soll alles in einer Datei (index.php) ablaufen. Ich weiß nur noch nicht, wie ich den aktuellen Pfad (das Verzeichnis, das ich angeklickt habe) zwischenspeichern soll.
 
Oh, danke, so in der Art hab ich mir das vorgestellt :)
Mein Problem bisher war, dass im Get dann Sachen wie ?d=./././Ordner/ oder so ähnlich rausgekommen sind.

Das Script von dir finde ich so schon (sehr) schön, aber könnte man die Verzeichnisse auch "variabel" auslesen, und trotzdem in der Art?
 
Den Abschnitt Testdaten meines Beispiels durch das folgende ersetzen
PHP:
//Homeverzeichnis definieren 
$dir = dirname(__FILE__).'/folderTree/';

//Home Node erstellen
$nodes[0] = array('master' => -1, 'title' => 'home', 'dir' => $dir);
//Alle Ordenr rekursiv auselsen
$nodes = readTree($dir, $nodes, 0);

/**
 * Liest ein Verzeichnis aus
 * @param String        $dir  
 * @param Array<Node>   $nodes
 * @param Number        $masterId
 * @return Array<Node>
 */
function readTree($dir, $nodes, $masterId){
    if (is_dir($dir)) {
        if ($dirHandler = opendir($dir)) {
            while (($subDir = readdir($dirHandler)) !== false) {
                if(is_dir($path = "{$dir}{$subDir}/") && $subDir != '.' && $subDir != '..'){
                    $id = count($nodes);
                    $nodes[$id] = array('master' => $masterId, 'title' => $subDir, 'dir' => $path);
                    $nodes = readTree($path, $nodes, $id);                    
                }
            }
            closedir($dirHandler);
        }
    }
    return $nodes;
}
 
Zurück