2013-10-24 21 views
6

私はファイルツリーを作成したいので、ファイルとディレクトリの配列を多次元ファイルツリー配列に変換する必要があります。たとえば、次のようにPHP - 動的多次元ファイルツリー配列を作成する

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

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

に私はこれを達成するためにいくつかの機能を試してみたが、それらの非が働いていました。私が遭遇した問題は、 array ('test','test','test'),'test'$array['test']['test']['test'] = 'test'に変換する簡単な方法がないという例です。

+0

を助けましたか? – AbraCadaver

答えて

1

は、私はそのためのPHPスニペットがあります

<?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

をここに1つ短い再帰的です:

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

このようなものを探していました。私は車を再発明する前に私がこの車を見てうれしいです。 – 58YtQ2H83m17838963l61BU07Y8622

1

my post hereに見てください。

答えは:strtokがあなたを保存します。

<?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)); 

出力:これらの答えの一つがあなたを

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" 
     } 
     } 
    } 
    } 
}