Verzeichnis-Struktur in Array ablegen ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
code
dank
datei
fehlermeldung
file
flag
header
index
info
inhalt
kleinigkeit
level
ordner
struktur
text
type
umsetzen
url
verzeichnis
-
Hallo
Ich habe eine Verzeichnis-Struktur wie z.B:
(Order gekennzeichnet durch » davor)
» / _old_index.html dirinfo1.php index.php test1.php » testdir1/ test2.php test3.php » testdir2/ test4.php » testdir4/ test6.php test7.php » testdir3/ test5.php ...
jetzt möchte ich diese Struktur in ein multidimensionales Array ablegen
also so, dass wenn Ordner, dann dessen Inhalte als Sub-Array
ich habe eine Funktion, die mir zwar die Verzeichnis-Struktur einliest,
aber nur in ein ein-dimensionales Array mit key = vollständiger Verzeichnis-Pfad
<?php // -------------------------------------------------- function listFolder($dir, $level=1, $dirdata=array()) { $exclude = array('.htaccess', 'geheim.php'); $ffsx = scandir($dir); foreach($ffsx as $ff){ if(is_array($exclude) and !in_array($ff,$exclude)){ if($ff != '.' && $ff != '..') { if(!is_dir($dir.'/'.$ff)){ $godir = ltrim($dir,'./'); if ($level == 1) { $dirdata['home'][] = $godir.'/'.$ff; } else { $dirdata[$godir][] = $godir.'/'.$ff; } } else { $level++; $dirdata = listFolder($dir.'/'.$ff, $level, $dirdata); $level--; } } } } return $dirdata; } // -------------------------------------------------- $path = '.'; $dirinfo = listFolder($path); // -------------------------------------------------- print "<pre style=\"margin:4px; padding:6px; background:#DEDEDE; text-align:left;\">\n"; print_r($dirinfo); print "</pre>\n"; // -------------------------------------------------- ?>
die Ausgabe davon ist:
Array ( [home] => Array ( [0] => /_old_index.html [1] => /dirinfo1.php [2] => /index.php [3] => /test1.php ) [testdir1] => Array ( [0] => testdir1/test2.php [1] => testdir1/test3.php ) [testdir1/testdir2] => Array ( [0] => testdir1/testdir2/test4.php ) [testdir1/testdir2/testdir4] => Array ( [0] => testdir1/testdir2/testdir4/test6.php [1] => testdir1/testdir2/testdir4/test7.php ) [testdir3] => Array ( [0] => testdir3/test5.php ) )
ich hätte aber gerne ein mehrdimensionales Array, das die Struktur in den Array-Ebenen abbildet,
ich komme aber nicht drauf, wie ich das machen soll ...
... irgendwie mit
... Struktur aufdröseln, ... aber dann ?!?$dirparts = explode('/',$godir);
Das Ergebnis soll in Etwa so aussehen:
Array ( [home] => Array ( [0] => _old_index.html [1] => dirinfo1.php [2] => index.php [3] => test1.php [testdir1] => Array ( [0] => test2.php [1] => test3.php [testdir2] => Array ( [0] => test4.php [testdir4] => Array ( [0] => test6.php [1] => test7.php ) ) ) [testdir3] => Array ( [0] => test5.php ) ) )
so oder auch ähnlich,
hauptsache die Struktur der Verzeichnisse wird im Array als Ebenen abgebildet.
ich hoffe da kann mir jemand dabei helfen,
wie ich aus der Verzeichnis-Struktur ein multidimensionalen Array erstellen kann ... ?
Danke!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Meinst du in etwa so etwas?
<?php header('content-type: text/plain; charset=utf-8'); function listFiles($dir) { $exclude = array('.htaccess', 'geheim.php'); $files = scandir($dir); $result = array(); foreach($files as $file) { if(is_array($exclude) && in_array($file, $exclude)) continue; if(($file == '.') || ($file == '..')) continue; if(is_dir("$dir/$file")) { // directory $result[$file] = listFiles("$dir/$file"); } else { // file $stat = stat("$dir/$file"); $result[$file] = $stat['size']; } } return $result; } function simpleTree($tree, $name = '', $level = 0) { $indent = str_repeat(' ', $level * 4); $dir = is_array($tree) ? '» ' : ''; $name .= is_array($tree) ? '/' : " ($tree)"; echo("$indent$dir$name\n"); if(is_array($tree)) foreach($tree as $file => $info) simpleTree($info, $file, $level + 1); } echo("print_r:\n"); print_r(listFiles('.')); echo("\nsimple tree:\n"); simpleTree(listFiles('.'));
Beitrag zuletzt geändert: 6.4.2013 15:59:22 von hackyourlife -
ja Super, Danke
eigentlich ja ganz einfach, ich stand nur irgendwie auf dem Sclauch
hatte die Vorgehensweise ja eigentlich schon
incdesign schrieb:
... wenn Ordner, dann dessen Inhalte als Sub-Array ...
aber ich bin da viel zu kompliziert dran gegenagen
also einfach direkt das umsetzen ... wenn Ordner, dann als Array ... :)
... sowas nennt man dann doch: "rekrisiver Funktionsaufruf" ?!
Jetzt bin ich aber noch drauf gekommen, das es evtl. doch nicht so gut ist,
wenn die Ordner-/Datei- Namen als KEY im Array stehen,
also besser wäre wohl eine Struktur, die keine "Werte" als KEY hat.
sonden nur "nummeriche" Keys (int) .... aber das ist auch nicht ohne .. oO
... einfach Ebene als Key nehmen geht nicht,
weil ja pro Ebene auch mehrere Unterordner drin sein können
-
<?php function dirTree($pattern = '*', $flags = 0, $path = false, $depth = 0, $level = 0) { $tree = array(); $files = glob($path . $pattern, $flags); $paths = glob($path . '*', GLOB_ONLYDIR|GLOB_NOSORT); if (!empty($paths) && ($level < $depth || $depth == -1)) { $level++; foreach ($paths as $sub_path) { $tree[] = dirTree($pattern, $flags, $sub_path . DIRECTORY_SEPARATOR, $depth, $level); } } $tree = array_merge($tree, $files); return $tree; } $tree = dirTree('*.*', 0, '.', -1); echo '<pre>'; print_r($tree); echo '</pre>'; ?>
Beitrag zuletzt geändert: 7.4.2013 13:30:47 von fabo -
Danke ... gute Idee mit glob()
... aber nur fast ... :)
wenn ein Ordner leer ist (keine Dateien drin) dann ist $files kein Array
Fehlermeldung:
Warning: array_merge() .... Argument #2 is not an array ...
also noch mit Erweiterung um die Kleinigkeit:
if (!$files) { $files = array(); } // --------- diese Zeile ist neu $tree = array_merge($tree, $files);
dann bekommt man leere Verzeichnisse als leeres Array ohne Fehlermeldung.
-
Alternativ könntest du auch sowas machen:
<?php header('content-type: text/plain; charset=utf-8'); function listFiles($dir) { $exclude = array('.htaccess', 'geheim.php'); $files = scandir($dir); $result = array(); foreach($files as $file) { if(is_array($exclude) && in_array($file, $exclude)) continue; if(($file == '.') || ($file == '..')) continue; if(is_dir("$dir/$file")) { // directory $result[] = (object) array( 'name' => $file, 'files' => listFiles("$dir/$file") ); } else { // file $result[] = $file; } } return $result; } function simpleTree($tree, $level = 0) { $indent = str_repeat(' ', $level * 4); if(is_array($tree)) { // root node $dir = '» '; $name = '/'; } else { $dir = is_object($tree) ? '» ' : ''; $name = is_object($tree) ? "{$tree->name}/" : $tree; } echo("$indent$dir$name\n"); if(is_object($tree)) $tree = $tree->files; if(is_array($tree)) foreach($tree as $file) simpleTree($file, $level + 1); } echo("print_r:\n"); print_r(listFiles('.')); echo("simpleTree:\n"); echo(simpleTree(listFiles('.')));
Die Variante mit dem assoziativen Array war aber einfacher, auch verstehe ich den Grund nicht, warum sie nicht »so gut« sein sollte…
Bei fabos Variante bekommst du übrigens nur Dateien und keine Ordner (außer indirekt durch den Dateinamen) … ob du das willst? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage