我想玩一些PHP的迭代器,并设法得到一个坚实的(从我的理解)建设去。我的目标是在父文件夹内迭代并获取2个节点;在这个过程中建立一个分层的树型数组。很明显,我可以使用glob和一些嵌套循环来很容易地完成这个任务,但是我想使用Spl类来完成这个任务。SplRecurisveDirectoryIterator&分层数组
所有这一切,我已经玩过SplHeap和SplObjectStore到层次结构和失败。和我的面条混淆的是我常规的递归方法失败(内存不足错误),我的一个成功归结于循环遍历每个节点的递归方法,并添加到数组中。问题在于它忽略了setMaxDepth()方法并遍历所有的孩子。我想过设置一个$ var ++通过循环增加,限制节点,但我不认为这是“正确的方式”。
Anywho,代码(对不起,如果有任何孤立的代码 - 只是忽略它)...
<?php
namespace Tree;
use RecursiveFilterIterator,
RecursiveDirectoryIterator,
RecursiveIteratorIterator;
class Filter extends RecursiveFilterIterator {
public static $FILTERS = array(
'.git', '.gitattributes', '.gitignore', 'index.php'
);
public function accept() {
if (!$this->isDot() && !in_array($this->current()->getFilename(), self::$FILTERS))
return TRUE;
return FALSE;
}
}
class DirTree {
const MAX_DEPTH = 2;
private static $iterator;
private static $objectStore;
public function __construct() {
error_reporting(8191);
$path = realpath('./');
try {
$dirItr = new RecursiveDirectoryIterator($path);
$filterItr = new Filter($dirItr);
$objects = new RecursiveIteratorIterator($filterItr, RecursiveIteratorIterator::SELF_FIRST);
$objects->setMaxDepth(self::MAX_DEPTH);
echo '<pre>';
print_r($this->build_hierarchy($objects));
} catch(Exception $e) {
die($e->getMessage());
}
}
public function build_hierarchy($iterator){
$array = array();
foreach ($iterator as $fileinfo) {
if ($fileinfo->isDir()) {
// Directories and files have labels
$current = array(
'label' => $fileinfo->getFilename()
);
// Only directories have children
if ($fileinfo->isDir()) {
$current['children'] = $this->build_hierarchy($iterator->getChildren());
}
// Append the current item to this level
$array[] = $current;
}
}
return $array;
}
}
$d = new DirTree;