Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 递归使用函数列出dir和subdir中的所有文件_Php_Function - Fatal编程技术网

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

Php 递归使用函数列出dir和subdir中的所有文件,php,function,Php,Function,我写下了这个简单的函数,将dir和subdir中的所有文件都放在一个数组中,但它不起作用。当我回显$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.

我写下了这个简单的函数,将dir和subdir中的所有文件都放在一个数组中,但它不起作用。当我回显
$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;
}
修复您的代码:

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;
}
结果将是:
数组('file.txt','file.jpg','file.txt')
(数组元素的顺序可能不同)。 请注意,
'file.txt'
出现两次,没有路径信息

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

    <?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>
    
    
    
    您不能附加
    $dir
    $f
    ,因为
    $dir
    是一个scandir结果数组。首先,您在函数中硬连接目录(
    $dir=scandir(ROOT_dir./test/);
    )-因此它只会扫描该目录。另一方面,当您进行递归调用时,实际上并没有向$list添加任何内容。这可能与糟糕的解决方案重复,这可以通过使用PHP的目录迭代器执行3行代码来实现。
    <?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>