我很久以前就编写了这段代码,以便从$dir中给出的文件夹结构中获取文件。
$recursiveIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::CHILD_FIRST);
$ritit = new RegexIterator($recursiveIterator, $filter);
foreach ($ritit as $splFileInfo) {
if(($splFileInfo->getFileName() != ".") && ($splFileInfo->getFileName() != "..")) {
$path = $splFileInfo->isDir()
? array($splFileInfo->getFilename() => array())
: array($splFileInfo->getFilename());
for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) {
$path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
}
$return = array_merge_recursive($return, $path);
}
}正如标题所暗示的,我希望$return数组首先拥有文件夹。我首先尝试在循环之后使用一个foreach来纠正这个错误,并排序到$folders和$files数组中,但是,如果孩子中有多个孩子,这不会改变文件夹中的内容。
有没有办法修改上面的循环,使所有文件夹首先出现在数组中,文件出现在后面?包括孩子和孩子的孩子吗?
发布于 2019-09-03 23:02:41
我不认为你可以通过修改循环来获得你想要的输出数组。相反,我宁愿使用递归排序函数来对循环后的数组进行排序。
首先,创建定义元素排序逻辑的函数。在本例中,您希望数组类型的元素是层中的第一个元素,因此排序函数可能如下所示:
function dirFirstSorting($a, $b)
{
if (is_array($a) && is_string($b)) {
return -1;
} elseif (is_string($a) && is_array($b)) {
return 1;
} else {
return 0;
}
}然后,创建一个对数组中的元素进行递归排序的函数:
function sortFilesListing(&$array)
{
if (is_array($array)) {
uasort($array, "dirFirstSorting");
array_walk($array, "sortFilesListing");
}
}你现在需要做的就是调用sortFilesListing函数,并提供$return数组:
sortFilesListing($return);现在应该对$return数组元素进行相应的排序。
https://stackoverflow.com/questions/57772592
复制相似问题