PHP glob() の戻りは相対パスなのか、絶対パスなのか
渡したパターンの形式によって、相対パスにも絶対パスにもなるようです。
Windows 10PHP 7.1.9
例えばWindows機で、以下のようなフォルダ構造があるとします。
C:/
└ study/
├ example/
│ ├ dir1/
│ │ └ file3.txt
│ ├ file1.txt
│ └ file2.txt
└ index.php
この index.php
で、以下の通りに glob()
を使った場合の結果を見てみました。
print_r( glob(__DIR__.'/example/*') );
print_r( glob('./example/*') );
print_r( glob(__DIR__.'\\example\\*') );
print_r( glob('.\\example\\*') );
Array
(
[0] => C:\study/example/dir1
[1] => C:\study/example/file1.txt
[2] => C:\study/example/file2.txt
)
Array
(
[0] => ./example/dir1
[1] => ./example/file1.txt
[2] => ./example/file2.txt
)
Array
(
[0] => C:\study\example\dir1
[1] => C:\study\example\file1.txt
[2] => C:\study\example\file2.txt
)
Array
(
[0] => .\example\dir1
[1] => .\example\file1.txt
[2] => .\example\file2.txt
)
というわけで glob()
の戻りは、パターンを絶対パスで指定すると絶対パスに、相対パスで指定すると相対パスになるみたいです。
それどころかパスの区切り文字まで渡したパターンのままですね。プラットフォームに依存したくなければ、/
\
じゃなくて DIRECTORY_SEPARATOR
を使いましょう。
print_r( glob(__DIR__.DIRECTORY_SEPARATOR.'example'.DIRECTORY_SEPARATOR.'*') );
print_r( glob('.'.DIRECTORY_SEPARATOR.'example'.DIRECTORY_SEPARATOR.'*') );
Array
(
[0] => C:\xampp\htdocs\study\glob\example\dir1
[1] => C:\xampp\htdocs\study\glob\example\file1.txt
[2] => C:\xampp\htdocs\study\glob\example\file2.txt
)
Array
(
[0] => .\example\dir1
[1] => .\example\file1.txt
[2] => .\example\file2.txt
)
なお、相対パスを絶対パスに変換したい場合は realpath()
を使います。また、ファイル名だけ抽出したければ basename()
を使います。
$list = glob('.'.DIRECTORY_SEPARATOR.'example'.DIRECTORY_SEPARATOR.'*');
if ($list !== false) {
foreach ($list as $relativePath) {
$absolutePath = realpath($relativePath);
$fileName = basename($relativePath);
echo '相対パス='.$relativePath.', 絶対パス='.$absolutePath.', ファイル名='.$fileName."\n";
}
}
相対パス=.\example\dir1, 絶対パス=C:\xampp\htdocs\study\glob\example\dir1, ファイル名=dir1
相対パス=.\example\file1.txt, 絶対パス=C:\xampp\htdocs\study\glob\example\file1.txt, ファイル名=file1.txt
相対パス=.\example\file2.txt, 絶対パス=C:\xampp\htdocs\study\glob\example\file2.txt, ファイル名=file2.txt