【问题标题】:PHP - Directory browsing from recursive to iterativePHP - 从递归到迭代的目录浏览
【发布时间】:2018-03-11 06:11:04
【问题描述】:

您好,我正在尝试迭代以下函数。它浏览所有目录并给我那里的所有文件。

function getFilesFromDirectory($directory, &$results = array()){
    $files = scandir($directory);

    foreach($files as $key => $value){
        $path = realpath($directory.DIRECTORY_SEPARATOR.$value);
        if(!is_dir($path)) {
            $results[] = $path;
        } else if($value != "." && $value != "..") {
            getFilesFromDirectory($path, $results);
            $results[] = $path;
        }
    }
    return $results;
}

我确信可以迭代这个函数,但我真的没有办法做到这一点。

【问题讨论】:

  • 我怀疑。目录树是一棵树。你事先不知道它有多深。
  • 绝对有可能,看我的回答。
  • 如果不将 push/pop 操作从递归函数调用移动到数据结构,这是不可能的 - 即,您可以使代码迭代(以一定成本)但不能迭代操作。你这样做的目的是什么?
  • @Jparkinson:不——这只是隐藏了对象后面的递归——这就是为什么你不能静态调用类的原因。
  • 但它没有达到作者想要的问题吗?递归通过返回其中所有文件路径的目录?

标签: php recursion iteration


【解决方案1】:

您会想要使用一些 PHP 基类来实现它。

RecursiveIteratorIterator 中使用 RecursiveDirectoryIterator 将允许您遍历目录中的所有内容,无论嵌套如何。

当循环遍历每个 $item 下的 $iterator 时,值得注意的是 SplFileinfo 类型的对象。可以在此处找到有关此课程的信息:http://php.net/manual/en/class.splfileinfo.php

<?php 

//Iterate over a directory and add the filenames of all found children
function getFilesFromDirectory($directory){
    //Return an empty array if the directory could not be found
    if(!is_dir($directory)){
        return array();
    }

    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory)
    );

    $found = array();
    foreach($iterator as $item){
        if(method_exists($item, 'isFile') && $item->isFile()){
            //Uncomment the below to exclude dot files
            //if(method_exists($item, 'isDot') && $item->isDot()){
            //  continue;
            //}
            
            //Pathname == full file path
            $found[] = $item->getPathname();
        }
    }

    return $found;
}

我使用此函数作为测试所做的一些找到的文件的 var_dump:

希望这会有所帮助!

【讨论】:

  • 已批准!感谢您的帮助@JParkinson1991。
猜你喜欢
  • 2013-12-01
  • 2012-11-06
  • 1970-01-01
  • 2013-12-31
  • 2013-07-05
  • 2013-08-18
相关资源
最近更新 更多