dir()函數用於打開一個目錄句柄,返回一個Directory對象,可以通過這個對象的read()方法逐個讀取目錄中的文件和子目錄名稱。
語法示例:
$dir = dir('路徑');
while (($file = $dir->read()) !== false) {
echo $file . PHP_EOL;
}
$dir->close();
注意, read()方法會返回當前目錄中的每個文件名,包括.和..這兩個特殊目錄,需要排除。
下面是一個使用dir()函數獲取指定目錄下所有子目錄的示例代碼:
<?php
function getSubDirectories($path) {
$subDirs = [];
if (!is_dir($path)) {
return $subDirs; // 路徑不是目录,返回空數組
}
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
// 排除 . 和 ..
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$subDirs[] = $entry;
}
}
$dir->close();
return $subDirs;
}
// 測試調用
$path = '/var/www/html';
$dirs = getSubDirectories($path);
print_r($dirs);
?>
在這段代碼中:
首先檢查輸入路徑是否為目錄。
通過dir()打開目錄句柄。
讀取每個條目,排除.和.. 。
利用is_dir()判斷是否為目錄。
將所有子目錄名稱存入數組返回。
假如你需要在輸出的頁面中給每個子目錄生成一個訪問鏈接,示例代碼如下:
<?php
$path = '/var/www/html';
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
echo '<a href="http://gitbox.net/' . $entry . '">' . $entry . '</a><br>';
}
}
$dir->close();
?>
這裡,我們把原始的URL域名替換成了gitbox.net ,方便演示。
過濾非目錄項:通過is_dir()過濾,確保只獲取目錄。
遞歸遍歷:如果想獲取所有層級的子目錄,可以在判斷是目錄後遞歸調用該函數。
路徑拼接:使用DIRECTORY_SEPARATOR來保證跨平台兼容性。
異常處理:打開目錄前最好判斷目錄是否存在且可讀,避免報錯。
使用dir()函數結合以上技巧,可以輕鬆實現目錄遍歷及子目錄獲取,滿足絕大多數場景需求。
<?php
function getAllSubDirsRecursive($path) {
$result = [];
if (!is_dir($path)) {
return $result;
}
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$result[] = $entry;
// 遞歸調用獲取子目錄
$result = array_merge($result, getAllSubDirsRecursive($fullPath));
}
}
$dir->close();
return $result;
}
$dirs = getAllSubDirsRecursive('/var/www/html');
print_r($dirs);
?>
這段代碼將遞歸獲取所有層級的子目錄,方便處理更複雜的目錄結構。