【问题标题】:PHP recursive function for printing files and directories is not working用于打印文件和目录的 PHP 递归函数不起作用
【发布时间】:2018-06-22 02:28:46
【问题描述】:

我正在尝试制作递归 PHP 函数,它将遍历目录和子目录树并将所有目录和文件放在一个数组中。

我的代码看起来合乎逻辑,但它不起作用。

目录和文件树:

PHP 代码

    <?php
        function printFiles($directory) {
            $files = array();

            foreach (scandir($directory) as $file) {
                if ($file === '.' || $file === '..') 
                    continue;

                // checking is it file or directory
                if (is_dir($directory . '\\'. $file)) {
                    return printFiles($directory . '\\'.  $file);
                }

                array_push($files, $file);
            }

            return($files);
        }

        $directory = 'C:\Users\Jakov\Desktop\DIRECTORIES';
        print_r(printFiles($directory));

    ?>

我得到了这个结果:

Array ( )

【问题讨论】:

  • 尝试在您的函数中回显/记录以找出它正在检查的内容以及正在插入的内容。
  • 我也试过了。由于某种原因,程序未通过以下 IF 语句条件:if (is_dir($directory . '\\'. $file));

标签: php recursion directory


【解决方案1】:

您只会获取函数遇到的第一个最深文件夹 A_1_1 中包含的文件,该文件夹中没有文件。

找到目录时不要返回。改为添加到当前列表:

// checking is it file or directory
if (is_dir($directory . '/'. $file)) {
    $files = array_merge($files, printFiles($directory . '/'.  $file));
} else {
    array_push($files, $file);
}

另外,使用/ 作为路径。它适用于 Windows,您将避免转义错误:

$directory = 'C:/Users/Jakov/Desktop/DIRECTORIES';

(在您的代码中,您应该使用\\ 而不是\ 作为分隔符。)

你也应该check for links - 并忽略它们 - 否则你可能会陷入无限循环。

【讨论】:

  • 我做了和你告诉我一样的事情,但我没有得到数组中的所有文件,我得到以下结果:Array ( [0] =&gt; textA_1.txt [1] =&gt; textA_2.txt [2] =&gt; text1.txt [3] =&gt; text2.txt )
  • 在对每个文件执行操作之前,请考虑是否真的需要将完整的文件列表存储在内存中。它可能会占用大量内存。尝试改用generators
  • 对我来说,它看起来像文件列表。如果您想要完整路径,请使用:array_push($files, realpath(($directory . '/'. $file));。如果您想在列表末尾“更深”的文件,请将目录解析放在文件之后。
  • 生成器是个好主意,但我需要使用递归并以这种方式执行并存储完整的文件列表,因为我正在编写考试并且它是在说明中编写的。
  • 我不需要完整的路径,我只需要将所有文件和目录写入数组,就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2014-05-20
  • 2017-10-25
  • 2014-09-07
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多