2013-10-24 7 views
6

Ich möchte einen Dateibaum erstellen, und zu diesem Zweck muss ich ein Array von Dateien und Verzeichnissen in ein mehrdimensionales Dateibaumarray konvertieren. Zum Beispiel:PHP - dynamisches multidimensionales Dateibaumarray erstellen

array 
(
    'file.txt', 
    'dir1/', 
    'dir1/dir2/', 
    'dir1/dir2/dir3/', 
    'dir1/file.txt', 
) 

zu

array 
(
    'file.txt', 
    'dir1' => 
    array 
    (
     'dir2' => 
     array 
     (
      'dir3' => 
      array(), 
     ), 
     'file.txt', 
    ) 
) 

Ich habe mehrere Funktionen versucht, dies zu tun, aber nicht von ihnen arbeitete. Das Problem, dass ich zum Beispiel festgestellt habe, dass es keinen einfachen Weg gibt, einen array ('test','test','test'),'test' zu $array['test']['test']['test'] = 'test' zu konvertieren.

+0

Hat eine dieser Antworten helfen Ihnen? – AbraCadaver

Antwort

1

Ich habe PHP-Snippet für das:

<?php 
function wps_glob($dir) { 
    foreach (glob($dir . '/*') as $f) { 
    if(is_dir($f)) { 
     $r[] = array(basename($f) => wps_glob($f)); 
    } 
    else { 
     $r[] = basename($f); 
    } 
    } 
    return $r; 
} 

function wps_files($path) { 
    $wpsdir = Array(
    'root' => $path, 
    'struktur' => wps_glob($path) 
); 
    return $wpsdir; 
} 
?> 

example usage here

3

Hier ist eine kürzere rekursiven ein:

function dir_tree($dir) {  
    $files = array_map('basename', glob("$dir/*")); 
    foreach($files as $file) { 
     if(is_dir("$dir/$file")) { 
      $return[$file] = dir_tree("$dir/$file"); 
     } else { 
      $return[] = $file; 
     } 
    } 
    return $return; 
} 
+0

Auf der Suche nach so etwas. Ich bin froh, dass ich das gesehen habe, bevor ich das Rad neu erfunden habe. – 58YtQ2H83m17838963l61BU07Y8622

1

einen Blick auf my post here nehmen.

Die Antwort ist: STRTok wird Sie speichern.

<?php 

$input = [ 
'/RootFolder/Folder1/File1.doc', 
'/RootFolder/Folder1/SubFolder1/File1.txt', 
'/RootFolder/Folder1/SubFolder1/File2.txt', 
'/RootFolder/Folder2/SubFolder1/File2.txt', 
'/RootFolder/Folder2/SubFolder1/SubSubFolder1/File4.doc', 
]; 

function parseInput($input) { 
    $result = array(); 

    foreach ($input AS $path) { 
    $prev = &$result; 

    $s = strtok($path, '/'); 

    while (($next = strtok('/')) !== false) { 
    if (!isset($prev[$s])) { 
     $prev[$s] = array(); 
    } 

    $prev = &$prev[$s]; 
    $s = $next; 
    } 
$prev[] = $s; 

unset($prev); 
} 
return $result; 
} 

var_dump(parseInput($input)); 

Ausgang:

array(1) { 
    ["RootFolder"]=> 
    array(2) { 
    ["Folder1"]=> 
    array(2) { 
     [0]=> 
     string(9) "File1.doc" 
     ["SubFolder1"]=> 
     array(2) { 
     [0]=> 
    string(9) "File1.txt" 
     [1]=> 
     string(9) "File2.txt" 
     } 
    } 
    ["Folder2"]=> 
    array(1) { 
     ["SubFolder1"]=> 
     array(2) { 
     [0]=> 
     string(9) "File2.txt" 
     ["SubSubFolder1"]=> 
     array(1) { 
      [0]=> 
      string(9) "File4.doc" 
     } 
     } 
    } 
    } 
}