我想玩一些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;