php目录迭代器按字母顺序排列

时间:2014-04-02 14:33:07

标签: php iterator directory-structure

对于一个项目,我们在类

中创建了一个递归的direcory迭代器

该课程如下

class Helpers {

    public static function fs_to_array($directory){
        $iritator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory), \RecursiveIteratorIterator::CHILD_FIRST); 
        $array_result = array(); 

        foreach ($iritator as $splFileInfo) {
            $fn = $splFileInfo->getFilename();

            if ($splFileInfo->isDir()){  
                if ($fn == '..' || $fn == '.' ){
                    continue;
                }
                $rec_path = array($fn => array());
            }else{
                continue;
            }

            for ($depth = $iritator->getDepth() - 1; $depth >= 0; $depth--) { 
                $rec_path = array($iritator->getSubIterator($depth)->current()->getFilename() => $rec_path); 
            } 
            $array_result = array_merge_recursive($array_result, $rec_path);
        }
        return $array_result;
    }
}

它将目录作为参数并以下列形式返回dir结构

Array
(
    [dir3] => Array
        (
            [dir_in_dir3] => Array
                (
                )

        )

    [dir1] => Array
        (
            [dir_in_dir1] => Array
                (
                )

        )

    [dir2] => Array
        (
        )

)

我希望这些可以进行全方位分类。

我如何使用迭代器进行此操作?

提前感谢大家!

1 个答案:

答案 0 :(得分:0)

迭代器无法直接排序,目录迭代器也不支持对基础数据进行排序。但是您可以将RecursiveIteratorIterator转换为具有iterator_to_array()的数组,然后使用usort()对数组进行排序,并使用getPathName()对元素进行自定义回调函数。您还可以在转换前使用CallbackFilterIterator()来减小数组的大小。

编辑示例:     

$directory = '...';

$it = new CallbackFilterIterator(
        new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST
        ), function ($entry) {
            // filtering unwanted elements to keep array small
            $fn = $entry->getFilename();
            if (!$entry->isDir()) {
                return false;
            } else if ($fn == '..' || $fn == '.') {
                return false;
            } else {
                return true;
            }
        }
);

$array = iterator_to_array($it);
// sorting entries
uasort($array, function ($a, $b) {
    return strcmp($a->getPathname(), $b->getPathname());
});

// do whatever you want - can be uses just like the RecursiveIteratorIterator before
foreach ($array as $v) {
    var_dump($v->getPathname());
}