2009-12-15 69 views
2

下面的函數將給定目錄中的所有文件夾返回到多個級別。使用glob返回給定目錄中的文件夾列表(不含路徑)

我只需要一個級別的深度,只是目標目錄中的文件夾,沒有子文件夾。

另外該函數返回文件夾的完整路徑,我只想要文件夾名稱。我確定我錯過了一些簡單的東西。

如何修改函數以僅返回給定目錄的文件夾名稱? (不是每個文件夾的完整路徑)

$ 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,感謝Doug對原函數的幫助!

回答

4

而不是使用glob(),我會建議使用DirectoryIterator類。

function get_dirs($path = '.') { 
    $dirs = array(); 

    foreach (new DirectoryIterator($path) as $file) { 
     if ($file->isDir() && !$file->isDot()) { 
      $dirs[] = $file->getFilename(); 
     } 
    } 

    return $dirs; 
} 
+0

嗨喬丹,這看起來不錯,但我有一個問題。我從本地運行它,但得到一個致命的錯誤... 致命錯誤:未知的異常'UnexpectedValueException'消息'DirectoryIterator :: __構造(../ wp-content/themes/mytheme/images)[directoryiterator.--construct]:無法打開目錄:沒有這樣的文件或目錄'在C:\ xampplite \ htdocs \ wordpress \ wp-content \ themes \ mytheme \ functions.php:436 – 2009-12-15 17:18:21

+0

這是我的調用者。 $ mydir = get_dirs('../ wp-content/themes/mytheme/images'); – 2009-12-15 17:19:00

+0

嘗試'$ mydir = get_dirs(realpath('../ wp-content/themes/mytheme/images'));'而不是。 – 2009-12-15 22:17:06

0

如果你只是想在當前文件夾的名稱,作爲回報,有一個平坦的陣列,可以extend一個RecursiveFilterIterator,只是在運行時收集的堆棧檢查時,如果你想accept()它。在accept()方法中,你當然會跳過沒有附加子迭代器的所有東西,所以你不必不必要地遍歷不需要的部分。

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

這使得很容易定義什麼是你想要的回報。 $cSPLFileInfo的一個實例,所以簡單地參考一下。

$iterator = new DirectoryStackIterator(
    new RecursiveDirectoryIterator(
     __DIR__, 
     FilesystemIterator::FOLLOW_SYMLINKS 
     | FilesystemIterator::SKIP_DOTS 
    ) 
); 

然後我們附上RecursiveDirectoryIterator(延伸FilesystemIterator,然後延伸DirectoryIterator - 看看你得到了什麼方法)和SKIP_DOTS,而是遵循符號鏈接。如果你不想要那個,請刪除後面的那個。

最後我們只是遍歷我們的迭代器迭代器而沒有真正做任何事情。請記住,在最後使用分號(;)時,不要在每次事故時觸發下一行的任何內容。

foreach ($iterator as $dir); 

收集我們的自定義堆棧則是很容易的:

var_dump($iterator->getStack()); 
相關問題