用于php的开箱即用的目录结构组件

时间:2012-01-04 19:57:59

标签: php json linux filesystems

有人知道一个现成的php类,它可以递归地读取文件系统目录(包括所有文件和子目录)并返回数组或对象或JSON字符串或结构的XML吗?

我会自己这样做,但客户刚刚打电话,并且坚持要在今天完成。耶。

3 个答案:

答案 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,您可以自己输出它或构建一个简单的循环函数。