PHP - 从递归到迭代的目录浏览

时间:2017-09-29 10:40:22

标签: php recursion iteration

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

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

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

1 个答案:

答案 0 :(得分:3)

你想要使用一些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:

enter image description here

希望这有帮助!