PHP - 创建动态多维文件树数组

7
我希望创建一个文件树,在此目的下,我需要将文件和目录数组转换为多维文件树数组。例如:
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'

3个回答

6
这里有一个更短的递归算法:

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

一直在寻找这样的东西。很高兴在重新发明轮子之前看到了这个。 - 58YtQ2H83m17838963l61BU07Y8622

4
请查看我的这篇文章
答案是: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"
         }
       }
     }
   }
 }

太完美了,我一整天都在苦思冥想,终于找到了!太棒了! - Othyn

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

这里是示例用法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接