dir()関数は、ディレクトリハンドルを開き、ディレクトリオブジェクトを返すために使用されます。ディレクトリ内のファイルとサブディレクトリ名は、このオブジェクトのread()メソッドを使用して1つずつ読み取ることができます。
構文例:
$dir = dir('パス');
while (($file = $dir->read()) !== false) {
echo $file . PHP_EOL;
}
$dir->close();
read()メソッドは、2つの特別なディレクトリを含む現在のディレクトリの各ファイル名を返すことに注意してください。そして.. 、そして除外する必要があります。
以下は、指定されたディレクトリ内のすべてのサブディレクトリを取得するために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);
?>
このコードは、より複雑なディレクトリ構造の処理を容易にするために、あらゆるレベルでサブディレクトリを再帰的に取得します。