こうこく
作 ▸
改 ▸

PHP glob() の戻りは相対パスなのか、絶対パスなのか

渡したパターンの形式によって、相対パスにも絶対パスにもなるようです。

Windows 10PHP 7.1.9

例えばWindows機で、以下のようなフォルダ構造があるとします。

  C:/
   └ study/
      ├ example/
      │  ├ dir1/
      │  │  └ file3.txt
      │  ├ file1.txt
      │  └ file2.txt
      └ index.php

この index.php で、以下の通りに glob() を使った場合の結果を見てみました。

PHP
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 を使いましょう。

PHP
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() を使います。

PHP
$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
この記事に何かあればこちらまで (非公開)