(yollar olmadan) verilen bir dizinde klasörlerin bir listesini döndürmek için glob kullanarak

2 Cevap

Aşağıdaki fonksiyonu birden çok düzeyde aşağı belirli bir dizindeki tüm klasörleri döndürür.

Ben sadece, hedef dizinde alt klasörler klasörleri olsa bir düzey derinliğe ihtiyaç duyar.

Ayrıca fonksiyon klasörün tam yolunu döndürür, sadece klasör adını istiyorum. Ben basit bir şey eksik eminim.

Nasıl işlev verilen dizinin sadece klasör adlarını dönmek için değiştirebilirsiniz? (Değil her klasörün tam yolları)

$ MyArray = get_dirs ('/ wp-content / themes / Mytheme / images..');

<?php
  function get_dirs( $path = '.' ){
	return glob( 
	  '{' . 
		$path . '/*,'    . # Current Dir
		$path . '/*/*,'  . # One Level Down
		$path . '/*/*/*' . # Two Levels Down, etc.
	  '}', GLOB_BRACE + GLOB_ONLYDIR );
  }
?>

btw, orijinal fonksiyonu yardım için Doug sayesinde!

2 Cevap

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() );