2015-06-18 50 views
-2
數組

可以說我有很多文件,其中一些是在這些路徑:迭代通過特定的目錄樹,所有的.ttf文件存儲到PHP

root/fonts/folder1/font1.ttf 
root/fonts/folder1/font2.ttf 
root/fonts/folder2/font1.ttf 
root/fonts/folder2/font2.ttf 
root/scripts/file.php 

記住,也存在這些文件夾中的其他類型的文件。我的「/scripts/file.php」如何遍歷「../fonts/」目錄樹並將所有TrueType字體(.ttf)文件存儲到數組中?你能告訴我一個例子嗎?

+0

尋找glob()http://php.net/manual/en/function.glob.php – Satya

+1

這看起來更像是**規範,而不是與特定問題有關的問題**。對不起,我們不在這裏爲你免費爲你工作。盡一切努力來解決問題,然後就特定問題尋求幫助。 – RiggsFolly

+0

[如何從使用PHP的文件夾中讀取文件的列表](http://stackoverflow.com/questions/720751/how-to-read-a-list-of-files-from-a-文件夾使用PHP) – thomasb

回答

1

SPL的遞歸迭代器是這種類型的功能特別有用:

abstract class FilesystemRegexFilter extends RecursiveRegexIterator { 
    protected $regex; 
    public function __construct(RecursiveIterator $it, $regex) { 
     $this->regex = $regex; 
     parent::__construct($it, $regex); 
    } 
} 

class FilenameFilter extends FilesystemRegexFilter { 
    // Filter files against the regex 
    public function accept() { 
     return (! $this->isFile() || preg_match($this->regex, $this->getFilename())); 
    } 
} 

class DirnameFilter extends FilesystemRegexFilter { 
    // Filter directories against the regex 
    public function accept() { 
     return (! $this->isDir() || preg_match($this->regex, $this->getFilename())); 
    } 
} 

$directory = new RecursiveDirectoryIterator(realpath(__DIR__ . '../fonts')); 
$filter = new DirnameFilter($directory, '/^(?!\.)/'); 
$filter = new FilenameFilter($filter, '/(?:ttf)$/i'); 

$myArray = []; 
foreach(new RecursiveIteratorIterator($filter) as $file) { 
    $myArray[] = $file; 
} 

雖然不知道爲什麼你需要建立一個數組,而不要簡單地與文件工作中的foreach循環內

+0

健壯! *(看起來比使用[此解決方案](http://stackoverflow.com/a/720758/4883372))*只是一個小問題,當我'var_dump'返回的'$文件'我看到這樣的對象(SplFileInfo)#280(2){[「pathName」:「SplFileInfo」:private] => string(81)「C:\ xampp \ apps \ wordpress \ htdocs \ wp-content \ themes \ theme- name \ fonts \文件夾\ font.ttf「[」fileName「:」SplFileInfo「:private] => string(8)」font.ttf「}'有沒有辦法獲得這個對象的*」fileName「*?我嘗試了'$ file ['fileName']'但是有一個_「致命錯誤:不能使用SplFileInfo類型的對象作爲數組在......」_除了'basename()'只是好奇而已.. – 5ervant

+0

你的意思就像調用SPLFileInfo對象的'getFilename()'或'getBasename()'方法? - http://www.php.net/manual/en/splfileinfo.getbasename.php –

0

這可能不是最完美的解決方案,但我曾經做過如下:

$all_files = scandir("path/to/your/dir"); 
$selected_files = array(); 

foreach($all_files as $file) 
{ 
    $tmp = explode(".", $file); 
    if($tmp[1] == "ttf") { 
    array_push($selected_files, $file); 
    } 
} 

現在所選擇的文件存儲在選擇素ted_files數組。

編輯: 當然,在這個解決方案中,您的文件名只能有一個點。

+0

你也需要通過子目錄進行這個遞歸 –

相關問題