对于一个项目,我们在类
中创建了一个递归的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
(
)
)
我希望这些可以进行全方位分类。
我如何使用迭代器进行此操作?
提前感谢大家!
答案 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());
}