PHP从目录中获取文件列表(在Moodle中)

PHP从目录中获取文件列表(在Moodle中),php,moodle,Php,Moodle,我想打开一个目录,读取其中的所有文件,并将它们放入数组,到目前为止,我有: $imagesdir = $CFG->dataroot.'/1/themeimages/'; 这给了我目录的路径,下一步是什么?解决方案是使用++(引用第一页的示例): 另一个解决办法是使用;引用”构造页面中的示例: $imagesdir = $CFG->dataroot.'/1/themeimages/'; $dir = new DirectoryIterator($imagesdir); foreac

我想打开一个目录,读取其中的所有文件,并将它们放入
数组
,到目前为止,我有:

$imagesdir = $CFG->dataroot.'/1/themeimages/';

这给了我目录的路径,下一步是什么?

解决方案是使用++(引用第一页的示例):


另一个解决办法是使用;引用
”构造
页面中的示例:

$imagesdir = $CFG->dataroot.'/1/themeimages/';
$dir = new DirectoryIterator($imagesdir);
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}

当然,在每种情况下,您都必须将文件放入一个数组中,而不仅仅是回显或转储文件名

这意味着在循环之前初始化数组:

$list_files = array();
在循环内部,根据您选择的解决方案,使用这两行中的一行:

$list_files[] = $file;
$list_files[] = $fileinfo->getFilename();

只需使用内置功能:

从目录中返回文件和目录的数组

所以你可以这样使用它:

$array = scandir($imagesdir);
当然,您也可以使用DirectoryIterator,但这要简单得多

您还可以剥离点文件:

$array = array_diff(scandir($imagesdir), array('.', '..'));

要获得更多面向对象的方法,请使用DirectoryIterator类

$images = array();
$imagesdir = $CFG->dataroot.'/1/themeimages/';
foreach (new DirectoryIterator($imagesdir) as $file) {
   if($file->isDot()) continue;
   $images[] = $file;
}

如果您以后还需要过滤器,以下是最短的解决方案:

$imagesdir = $CFG->dataroot.'/1/themeimages/*.*';
foreach (glob($imagesdir) as $file)
  array_push($files,$file);
php自动排除

如果不需要所有文件,也可以指定自己的掩码,如上面的
*.*
php还会自动为您创建
$files
数组

最后一行也可以是:

$files[]=$file;

从您的标记列表中,我假设您使用的是Moodle,您可以简单地使用:

function get_directory_list($rootdir, $excludefiles='', $descend=true, $getdirs=false, $getfiles=true)
该函数包含在moodlelib.php中

从文件中读取:

  • 返回一个包含所有 *所有子目录中的文件名, 相对于给定的rootdir
有关可选参数的更多信息,请参阅官方文件


filelib.php中还提供了读取文件内容的函数。

+1。glob()也是一个选项,虽然功能更丰富,性能可能更低。请注意,将DirectoryIterator的“当前”值指定给这样的数组时。当您开始使用$images数组执行任何操作时,它的所有项都将是指向最后一个元素之外的相同DirectoryIterator(因此完全没有用处)。这是意料之中的(尽管是不幸的)行为。谢天谢地,这里有一个快速修复方法:在分配给数组时,确保“克隆”了$文件。Moodle为此提供了一个库函数。不需要重新发明轮子。
function get_directory_list($rootdir, $excludefiles='', $descend=true, $getdirs=false, $getfiles=true)