1. 程式人生 > >PHP -- 遍歷出目錄下所有檔案,及演算法優化

PHP -- 遍歷出目錄下所有檔案,及演算法優化

在想解決這個問題的時候,我也查找了很多資料。推薦給大家我個人覺得比較好的一篇:PHP遍歷檔案目錄

文中第四個演算法可以遍歷出文件夾下的所有檔案,程式碼如下:

$dir = 'E:\phpStudy\PHPTutorial\WWW';
echo '<pre>';
function listDir($dir)
{
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                if ((is_dir($dir . "/" . $file)) && $file != "." && $file != "..") {
                    echo "檔名:", "$file\n";
                    listDir($dir . "/" . $file . "/");
                } else {
                    if ($file != "." && $file != "..") {
                        echo "$file\n";
                    }
                }
            }
            closedir($dh);
        }
    }
}
listDir($dir);

左圖:這是我設定的檔案目錄E:\phpStudy\PHPTutorial\WWW

右圖:為頁面打印出來的部分資訊,檢測5次後,得出的耗時平均時間為:3754.5224189758毫秒。

演算法優化:

雖然這個演算法可以很好的遍歷出目中的所有檔案,但是PHP有個更好的函式可以利用:scandir()glob();對於優化演算法較上述演算法有以下兩點優化:

1. 打印出的內容有目錄,展現更加明確;

2. 時間略有減少,速度提升。

演算法一、scandir()方法優化程式碼如下:

$dir = 'E:\phpStudy\PHPTutorial\WWW';
echo '<pre>';
function getDir1($dir)
{
    $arr = scandir($dir);
    foreach ($arr as $file) {
        if ($file != '.' && $file != '..') {
            $path = $dir . '/' . $file;
            if (is_dir($path)) {
                getDir1($path);
            } else {
                echo "$path\n";
            }
        }
    }
}
getDir1($dir);

檢測5次後,得出的耗時平均時間為:3527.3191928864毫秒。

演算法二、glob()方法優化程式碼如下:

$dir = 'E:\phpStudy\PHPTutorial\WWW';
function getDir2($dir)
{
    foreach (glob($dir . '\*') as $file) {
        if (is_dir($file)) {
            getDir2($file);
        } else {
            echo  "$file\n";
        }
    }
}
getDir2($dir);

檢測5次後,得出的耗時平均時間為:3330.0499916077毫秒。 

 下圖是打印出的部分檔案格式: 

總結:

由上可以看出:演算法二 > 演算法一 > 引用演算法

在實際應用中,我們需要指定副檔名的列舉目錄內所有檔案的話,還是推薦如下:

foreach (glob('*.檔案字尾') as $filename) {
    echo $filename;
}

歡迎補充!

千而の大獅子!