递归使用函数列出dir和subdirs中的所有文件

时间:2013-06-24 14:49:22

标签: php function

我写下了这个简单的函数,在一个数组上有dir和subdirs中存在的所有文件,但它不起作用。当我回声$f时,没有任何东西在移动。 我哪里错了?

define('ROOT_DIR', __DIR__);

function scanSubDir($w_dir){
    $dir = scandir($w_dir);

    foreach($dir as $f){
        if($f != '..' || $f != '.'){
            if(is_file($w_dir.$f)){
                $list[] = $f;
            }elseif(is_dir($w_dir.$f)){
                scanSubDir($w_dir.$f);
            }
        }
    }
    return $list;
}

$file = scanSubDir(ROOT_DIR.'/test/');

foreach($file as $f){
    echo $f;
}

2 个答案:

答案 0 :(得分:0)

修复代码:

function scanSubDir($w_dir){
    $dir = scandir($w_dir);

    $list = array(); // <-- create initially empty list of files 
    foreach($dir as $f){
        if($f != '..' || $f != '.'){
            if(is_file($dir.$f)){
                $list[] = $f;
            }elsif(is_dir($dir.$f)){
                $sublist = scanSubDir($dir.PATH_SEPARATOR.$f); // <-- include path separator! 
                $list = array_merge($list, $sublist); // <-- merge the result of the recursive call
            }
        }
    }
    return $list;
}

请注意:

  • 结果列表仅包含没有路径的文件名。你的情况可能还可以。例如,对于以下目录结构:

     dir
     |_ subdir 
     |  |_ file.txt
     |  |_ file.jpg
     |_ file.txt
    

    结果将是:array('file.txt', 'file.jpg', 'file.txt')(数组元素的顺序可能不同)。 请注意'file.txt'来了两次,没有路径信息。

  • 符号/硬链接可能会产生无限递归,导致堆栈溢出:) 如果您的目录应包含链接,您可能需要考虑这一点。

答案 1 :(得分:0)

试试这个:

<?php
function _scandir($dir = '.', $files = array())
{
    foreach(glob($dir . '/*') as $file) {
        if(is_file($file)) {
            $files[] = $file;
        }else{
            $files = array_merge($files, _scandir($file));
        }
    }
    return $files;
}
?>

<pre>
<?php print_r(_scandir()); ?>
</pre>