有人知道一个现成的php类,它可以递归地读取文件系统目录(包括所有文件和子目录)并返回数组或对象或JSON字符串或结构的XML吗?
我会自己这样做,但客户刚刚打电话,并且坚持要在今天完成。耶。
答案 0 :(得分:2)
您可以使用内置RecursiveDirectoryIterator
Docs类来创建您希望的结果。在以下示例中,创建了一个分层数组:
$dir = '.';
$dirit = new RecursiveDirectoryIterator($dir);
$it = new RecursiveIteratorIterator($dirit);
$array = array();
foreach($it as $file)
{
$path = substr($file, strlen($dir)+1);
$parts = explode(DIRECTORY_SEPARATOR, $path);
$filename = array_pop($parts);
$dirname = implode(DIRECTORY_SEPARATOR, $parts);
$build = &$array;
foreach($parts as $part)
{
if (!isset($build[$part])) $build[$part] = array();
$build = &$build[$part];
}
$build[] = $filename;
unset($build);
}
然后 $array
将包含列表:
Array
(
[0] => .buildpath
[1] => .project
[.settings] => Array
(
[0] => org.eclipse.php.core.prefs
)
[array] => Array
(
[0] => array-keys.php
[1] => array-stringkey-explode.php
)
)
使用json_encode
Docs可以简单地将其转换为:
json_encode($array);
{"0":".buildpath","1":".project",".settings":["org.eclipse.php.core.prefs"],"array":["array-keys.php","array-stringkey-e
xplode.php"]}
正如我在上面的评论中写的那样,glob
也很有用。
答案 1 :(得分:1)
在PHP manual for dir的评论页面中有一个代码片段,用于递归查看目录(和子目录)的内容;)而不是echo语句,只需加载一个数组并返回(所以它将是一个数组的数组)。您需要过滤.
和..
,否则主要是为您完成。
答案 2 :(得分:1)
您可以使用globals(yuk)或数组合并技术自行构建它。这是一个基本的:
function recursiveListing($currentDir){
$results = array();
$dh = opendir($currentDir);
while(($f = readdir($dh)) !== false){
if($f == '.' || $f == '..'){ continue; }
$results[] = $currentDir.'/'.$f;
if(is_dir($currentDir.'/'.$f)){
$results = array_merge($results, recursiveListing($currentDir.'/'.$f));
}
}
return $results;
}
这应该是你的开始,应该建立一个完整路径列表。使用json_encode()将json作为json返回相对容易。对于XML,您可以自己输出它或构建一个简单的循环函数。