如何在PHP中显示目录和子目录的文件夹

5

我正在尝试获取一个包含文件夹和子文件夹的列表,以下是允许我获取文件夹和子文件夹的代码,但我需要像下面的例子一样对其进行排序,我一直在尝试,但不知道如何解决。

Root/
Root/Images
Root/Images/UserImages

Root/Text/
Root/Text/User1/
Root/Text/User1/Folder2

但目前它的显示效果是这样的:
Root/css/
tree/css/
js/
images/

PHP代码:

    function ListFolder($path)
{

    $dir_handle = @opendir($path) or die("Unable to open $path");

    //Leave only the lastest folder name
    $dirname = end(explode("/", $path));

    //display the target folder.
    echo ("$dirname/");
    while (false !== ($file = readdir($dir_handle)))
    {
        if($file!="." && $file!="..")
        {
            if (is_dir($path."/".$file))
            {
                //Display a list of sub folders.
                ListFolder($path."/".$file);
                echo "<br>";
            }
        }
    }


    //closing the directory
    closedir($dir_handle);
}

    ListFolder("../");

谢谢你


3个回答

4

将目录名称收集到数组中,而不是直接使用echo进行输出。使用sort对数组进行排序,并使用foreach循环打印列表。

因此,您将使用$dirnames[] = $dirname;代替echo ("$dirname/");(在第一次调用"ListFolder"之前使$dirnames全局并初始化)。然后,在"ListFolder"递归运行后,您会执行sort($dirnames);,然后进行以下输出:

foreach ($dirnames as $dirname)
{
  echo $dirname . '<br />';
}

1

你可以使用 DirectoryIterator 或更好的 RecursiveDirectoryIterator 来实现你想要的功能,它们都是来自于 php SPL。

这里是一个关于如何使用它的快速示例:

    $dir = '/path/to/directory';
    $result = array();

    if (is_dir($dir)) {
            $iterator = new RecursiveDirectoryIterator($dir);
            foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) {                    
                if (!$file->isFile()) {
                    $result[] = 'path: ' . $file->getPath(). ',  filename: ' . $file->getFilename();
                }
            }

    }

这应该能解决问题。祝你好运;)


如果 $dir 不是目录,则跳过 is_dir() 并捕获 RecursiveDirectoryIterator 抛出的 UnexpectedValueException 或许更好;后者无论如何都会检查目录。您还可以将迭代器包装在 ParentIterator 中,仅列出目录,并放弃 isFile() 条件。 - salathe
是的,你说得对,我本来可以并且应该这样做,但是在这里我只是想给他展示一个快速示例。谢谢! - misterjinx

1
使用此代码,您将获得带有子目录的列表(但请设置您的文件夹名称)。
<?php
$path = realpath('yourfolder/examplefolder');
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
{
        echo "$filename\n";
}
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接