0

我写下了这个简单的函数,以将目录和子目录中存在的所有文件都放在一个数组上,但它不起作用。当我回声时,$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;
}
4

2 回答 2

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'来了两次,没有路径信息。

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

于 2013-06-24T14:57:16.370 回答
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>
于 2013-06-24T14:58:18.997 回答