我想玩弄一些 PHP 的迭代器,并设法得到一个可靠的(根据我的理解)构建。我的目标是在父文件夹中迭代并关闭 2 个节点;在此过程中构建层次树数组。显然,我可以使用 glob 和几个嵌套循环来相当容易地做到这一点,但我想使用 Spl 类来实现这一点。
所有这些,我都在玩过 SplHeap 和 SplObjectStore 到层次结构并失败了。让我的面条搞砸的是我的正常递归方法失败(内存不足错误),而我的一个成功在于循环遍历每个节点并添加到数组的递归方法。这样做的问题是它忽略了 setMaxDepth() 方法并遍历了所有的孩子。我想过设置一个 $var++ 通过循环递增,限制节点,但我不相信这是“正确的方式”。
任何人,代码(抱歉,如果有任何孤立代码 - 请忽略它)...
<?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;