Durumda sadece geçerli klasör adı istiyorum ve karşılığında düz bir dizi var, yapabilirsin extend
bir RecursiveFilterIterator
ve sen {[(isterseniz denetlerken sadece RunTime sırasında bir yığın toplamak 2)]} bunu. accept()
yöntemi içinde elbette ekli hiçbir çocuk yineleyicileri her şeyi atlamak, bu nedenle gereksiz yere gereksiz bölümlerinden geçerken yoktur.
class DirectoryStackIterator extends RecursiveFilterIterator
{
public static $stack = [];
public function __construct( FilesystemIterator $iterator )
{
parent::__construct( $iterator );
}
public function getStack()
{
return self::$stack;
}
public function accept()
{
if ( $this->hasChildren() )
{
foreach ( $this->getChildren() as $c )
{
$dir = basename( $c->getPath() );
$c->isDir()
&& ! in_array( $dir, self::$stack )
AND self::$stack[] = $dir;
}
}
return $this->hasChildren();
}
}
Bu oldukça kolay karşılığında ne istediğinizi tam olarak tanımlamak için yapar. $c
SPLFileInfo
bir örneği olduğunu, yani sadece o bakın.
$iterator = new DirectoryStackIterator(
new RecursiveDirectoryIterator(
__DIR__,
FilesystemIterator::FOLLOW_SYMLINKS
| FilesystemIterator::SKIP_DOTS
)
);
Sonra bir RecursiveDirectoryIterator
(o uzanan DirectoryIterator
, FilesystemIterator
uzandığı - ne var yöntemler görmek için) takın ve SKIP_DOTS
, fakat sembolik izleyin. Bunu istemiyorsanız, daha sonra tek tek çıkarın.
Nihayet biz sadece aslında hiçbir şey yapmadan bizim yineleyici Yineleyicilerin geçerken. Kaza başına sonraki satırda şey tetiklemek değil sonunda (;
), bir noktalı virgül kullanmak unutmayın.
foreach ( $iterator as $dir );
O bizim özel yığını toplama oldukça kolaydır:
var_dump( $iterator->getStack() );