首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 遍歷目錄兩大經典方法對比:glob 遞歸 vs DirectoryIterator 迭代器

     編輯:PHP 相關知識

場景需求

項目中常需掃描目錄獲取所有文件路徑(如自動加載、批量處理、構建文件索引)。PHP 提供多種方式,本文對比兩種最常用的實現:glob() 遞歸與 DirectoryIterator (SPL) 迭代器。

方法一:glob() 遞歸掃描

<?php
function scanGlob($pattern) {
    foreach (glob($pattern) as $path) {
        if (is_dir($path)) {
            scanGlob($path . '/*'); // 遞歸進入子目錄
        } else {
            echo $path . '<br/>'; // 處理文件
        }
    }
}
// 使用:掃描 D:/wamp/www/exe1 下所有文件
scanGlob('D:/wamp/www/exe1/*');
?>

特點:

  • 代碼極其簡潔,利用 Shell 通配符語法。
  • 返回完整路徑數組,一次性加載到內存,大目錄可能佔用較多內存。
  • 不返回 . 和 ..,無需手動過濾。
  • Windows 下 glob() 不區分大小寫;Linux 區分。

方法二:DirectoryIterator (SPL) 迭代器

<?php
function scanIterator($path) {
    $dir = new DirectoryIterator($path);
    foreach ($dir as $file) {
        if ($file->isDot()) continue; // 跳過 . 和 ..
        $full = $file->getPathname();
        echo $full . '<br>';
        if ($file->isDir()) {
            scanIterator($full); // 遞歸
        }
    }
}
// 使用:掃描當前文件所在目錄的上兩級
scanIterator(dirname(dirname(__FILE__)));
?>

特點:

  • 面向對象風格,屬於 SPL 標準庫,無需擴展。
  • 逐個迭代,內存佔用恆定(不一次性加載所有結果)。
  • 提供豐富方法:isDir(), isFile(), getSize(), getMTime(), getExtension() 等。
  • 需手動過濾 isDot()。

進階:RecursiveDirectoryIterator + RecursiveIteratorIterator

一行代碼實現遞歸遍歷,且可配合 RegexIterator 過濾:

<?php
$path = '/var/www/project';
$ri = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS));
// 僅獲取 .php 文件
$phpFiles = new RegexIterator($ri, '/\.php$/i');
foreach ($phpFiles as $file) {
    echo $file->getPathname() . '<br>';
}
?>

性能與選型建議

維度glob()DirectoryIteratorRecursiveIteratorIterator
代碼簡潔度★★★★★★★★☆☆★★★★★
內存效率低 (全量數組)高 (逐個迭代)高 (逐個迭代)
功能豐富度低 (僅路徑)高 (SplFileInfo)高 (SplFileInfo)
過濾靈活性通配符手動判斷極高 (RegexIterator, CallbackFilterIterator)
推薦場景小目錄、一次性腳本、簡單通配符匹配中大型目錄、需文件元信息、長運行進程複雜過濾、多條件篩選、現代框架開發

最佳實踐總結

  1. 簡單腳本/小目錄:直接用 glob(),開發效率最高。
  2. 生產環境/大目錄/需元數據:首選 RecursiveDirectoryIterator 配合迭代器過濾器,內存安全、功能強大。
  3. 避坑指南:
    • Windows 下 glob() 路徑分隔符建議用正斜杠 /。
    • 遍歷極深目錄樹時遞歸可能導致棧溢出,迭代器模式同樣受限,極端情況需改用显式棧非遞歸實現。
    • 權限不足目錄會拋出異常,建議包裹 try-catch。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved