首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第一个来自RecursiveDirectoryIterator的文件夹

第一个来自RecursiveDirectoryIterator的文件夹
EN

Stack Overflow用户
提问于 2019-09-03 21:17:31
回答 1查看 67关注 0票数 0

我很久以前就编写了这段代码,以便从$dir中给出的文件夹结构中获取文件。

代码语言:javascript
复制
$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数组中,但是,如果孩子中有多个孩子,这不会改变文件夹中的内容。

有没有办法修改上面的循环,使所有文件夹首先出现在数组中,文件出现在后面?包括孩子和孩子的孩子吗?

EN

回答 1

Stack Overflow用户

发布于 2019-09-03 23:02:41

我不认为你可以通过修改循环来获得你想要的输出数组。相反,我宁愿使用递归排序函数来对循环后的数组进行排序。

首先,创建定义元素排序逻辑的函数。在本例中,您希望数组类型的元素是层中的第一个元素,因此排序函数可能如下所示:

代码语言:javascript
复制
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;
    }
}

然后,创建一个对数组中的元素进行递归排序的函数:

代码语言:javascript
复制
function sortFilesListing(&$array)
{
    if (is_array($array)) {
        uasort($array, "dirFirstSorting");
        array_walk($array, "sortFilesListing");
    }
}

你现在需要做的就是调用sortFilesListing函数,并提供$return数组:

代码语言:javascript
复制
sortFilesListing($return);

现在应该对$return数组元素进行相应的排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57772592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档