在PHP中递归列出子目录很麻烦

在PHP中递归列出子目录很麻烦,php,recursion,Php,Recursion,我有以下代码片段。我试图列出目录中的所有文件,并让用户可以下载它们。这个脚本可以很好地处理没有子目录的目录,但是如果我想获取子目录中的文件,它就不能工作。它只列出目录名。我不知道为什么is_dir对我不好。。。我对此有点困惑。我相信有更好的方法可以递归列出所有文件,所以我愿意接受任何建议 function getLinks ($folderName, $folderID) { $fileArray = array(); foreach (new DirectoryIterator(<so

我有以下代码片段。我试图列出目录中的所有文件,并让用户可以下载它们。这个脚本可以很好地处理没有子目录的目录,但是如果我想获取子目录中的文件,它就不能工作。它只列出目录名。我不知道为什么is_dir对我不好。。。我对此有点困惑。我相信有更好的方法可以递归列出所有文件,所以我愿意接受任何建议

function getLinks ($folderName, $folderID) {
$fileArray = array();

foreach (new DirectoryIterator(<some base directory> . $folderName) as $file) {
    //if its not "." or ".." continue
    if (!$file->isDot()) {              
            if (is_dir($file)) {                     
                $tempArray = getLinks($file . "/", $folderID);
                array_merge($fileArray, $tempArray);

            } else {
                $fileName = $file->getFilename();                           
             $url = getDownloadLink($folderID, $fileName);
             $fileArray[] = $url;               
            }                       
    }
}
函数getLinks($folderName,$folderID){ $fileArray=array(); foreach(新的DirectoryIterator(.$folderName)作为$file){ //如果不是“.”或“.”继续 如果(!$file->isDot()){ 如果(is_dir($file)){ $tempArray=getLinks($file.“/”,$folderID); 数组\合并($fileArray,$tempArray); }否则{ $fileName=$file->getFilename(); $url=getDownloadLink($folderID,$fileName); $fileArray[]=$url; } } }
您可以使用,而不是使用DirectoryIterator,它提供递归迭代文件结构的功能。文档中的示例:

$path = realpath('/etc');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo "$name\n";
}
这将打印所有文件和文件的列表 $path下的目录(包括 $path ifself)。如果要忽略 目录,删除 递归迭代器::SELF_优先 部分


您应该使用RealsivDealTyryTyror,但您可能还需要考虑使用SimFoYY2的组件。它允许简单的即时过滤(按大小、日期、……)。,包括dir或文件,不包括dir或dot文件等。查看文件中的docblock以获取说明。

可能与我正在查找的内容重复!我稍后将修改我的代码并试一试。谢谢!将其替换到我的代码中,效果非常好。但是,isDot不再工作。它给出以下错误:致命的e错误:调用未定义的方法SplFileInfo::isDot()。知道为什么吗?@thomascirca:你可能想看看这个,似乎SPL比其他解决方案慢50%。