Php Opendir在子文件夹中的文件之前获取文件数组
我有一个函数,返回递归文件夹中的文件数组Php Opendir在子文件夹中的文件之前获取文件数组,php,opendir,Php,Opendir,我有一个函数,返回递归文件夹中的文件数组 protected function getFiles($base) { $files = array(); if(!is_dir($base)) return $files; if (($handle = opendir($base)) != false) { while (false !== ($file = readdir($handle))) { if ($file
protected function getFiles($base) {
$files = array();
if(!is_dir($base)) return $files;
if (($handle = opendir($base)) != false) {
while (false !== ($file = readdir($handle))) {
if ($file == "." || $file == "..") continue;
if(is_dir("$base/$file")) {
$subfiles = $this->getFiles("$base/$file");
$files = array_merge($files, $subfiles);
} else {
if(File::type($file,false) == "xml")
$files[] = "$base/$file";
}
}
closedir($handle);
}
return $files;
}
我如何修改它,使它总是先列出根文件,然后再列出任何子文件夹?目前默认情况下,文件夹总是排在第一位 只需在循环目录指针的同时创建一个子目录数组,并在末尾迭代目录数组:
protected function getFiles($base) {
$files = $dirs = array();
if(!is_dir($base)) return $files;
if (($handle = opendir($base)) != false) {
while (false !== ($file = readdir($handle))) {
if ($file == "." || $file == "..") continue;
if(is_dir("$base/$file")) {
$dirs[] = "$base/$file";
} else {
if(File::type($file,false) == "xml")
$files[] = "$base/$file";
}
}
closedir($handle);
foreach ($dirs as $dir) {
$subfiles = $this->getFiles($dir);
$files = array_merge($files, $subfiles);
}
}
return $files;
}
使用两个数组,一个用于当前文件夹中的文件,另一个用于子文件夹中的文件,然后合并它们
protected function getFiles($base) {
$files = array();
$subFiles = array();
if(!is_dir($base)) return $files;
if (($handle = opendir($base)) != false) {
while (false !== ($file = readdir($handle))) {
if ($file == "." || $file == "..") continue;
if(is_dir("$base/$file")) {
$subFiles = array_merge($subFiles, $this->getFiles("$base/$file"));
} else {
if(File::type($file,false) == "xml")
$files[] = "$base/$file";
}
}
closedir($handle);
}
return array_merge($files, $subFiles);
}
您可能想看看PHP SPL DirectoryIterator类。您可以实例化该对象,然后快速迭代以分割出目录、文件和链接,并获得每个对象的完整SplFileInfo对象(这使您可以很容易地获得有关文件的任何信息) 抱歉,我刚意识到你想递归地做。对于这一点,可以使用递归DirectoryIterator,但概念基本相同
$directory = '/path/to/directory';
$iterator = new DirectoryIterator($directory);
$dirs = array();
$files = array();
$links = array();
foreach($iterator as $obj) {
if($obj->isFile()) {
$files[] = $obj;
} else if ($obj->isDir()) {
$dirs[] = $obj;
} else if ($obj->isLink()) {
$links[] = $obj;
}
}