こんにちは!エンジニアのオータケです!
PHPでWebサービスを開発中に特定のディレクトリ内のファイル名一覧を取得したいと思ったことはありませんか?
また、そういった状況になった際にどうやって取得すべきか困ったことはありませんか?
今回は
・ディレクトリ内のファイル名一覧を取得する方法
・globの使い方
といった基本的な内容から
・ワイルドカードを使った指定方法
・ファイルパスを元に同じディレクトリ内のファイル一覧を取得
の実践的な方法についても解説していきます!
ディレクトリ内のファイル一覧を取得するには
まず、ディレクトリ内のファイル一覧を取得するためにはいくつかの方法があります。
例えばopendir関数とreaddir関数を組み合わせてループ処理を行いながら取得する場合です。
こちらは公式ドキュメントからの引用になりますが次のようなコードになります。
<?php $dir = "/etc/php5/"; // 既知のディレクトリをオープンし、その内容を読み込みます。 if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } ?>
ただし、これは少し面倒くさい気もします。
PHP4.3以降ではglobというとても便利な関数があるためこの関数を今回は使っていきましょう!
globを使ってみる
では早速glob関数を使ってみましょう。
glob関数は先程、扱ったopendirとは違い引数に値を渡すだけで戻り値としてディレクトリ内のファイル一覧を配列形式で取得することが可能です。
今回はこのようなディレクトリ構成になっているとします。
SampleDirectory index.php page.php SampleDirectory2 index.php page2.php
SampleDirectoryの中にPHPコードも入っていますが、SampleDirectory2というディレクトリが入れ子になっています。
では早速サンプルコードを見てみましょう。
<?php $result = glob('./SampleDirectory/*'); var_dump($result); ?>
現在いるディレクトリの下にSampleDirectoryがあるとします。そしてディレクトリ内のファイルをすべて取得したいためワイルドカード(*)を使ってすべてを指定しています。
このサンプルコードの実行結果は次のようになります。
実行結果:
array(3) { [0]=> string(11) "./index.php" [1]=> string(10) "./page.php" [2]=> string(18) "./SampleDirectory2" }
このようにSampleDirectory内のファイル一覧が取得できました。
しかし、ディレクトリについてはディレクトリ名を返しその直下にあるファイル名は返しません。
とても簡単ですよね?
次の章では今回指定に使ったワイルドカードをより様々な形で使ってみましょう。
globをより実践的に使う
ファイルの種別を絞り込んで一覧を取得
先程はワイルドカードを使ってすべてのファイルを読み込むようにしました。
では拡張子を絞り込んでファイル名一覧を取得したい場合はどうすればよいでしょうか?
答えはとても簡単です。拡張子を付けてファイル名だけワイルドカードにすればよいのです。
どういうことなのか、実際のサンプルコードを見てみましょう!
<?php $result = glob('./SampleDirectory/*.php'); var_dump($result); ?>
先程のサンプルコードの場合は
$result = glob('./SampleDirectory/*');
となっていました。
今回は拡張子を指定しているので次のようなコードに変えています。
$result = glob('./SampleDirectory/*.php');
これで拡張子がphpのファイルだけ抽出することが可能です。
ファイルと同じ階層のファイル名一覧を取得する
今度は特定のファイルパスがあり、そのファイルが置かれている場所のファイル名一覧を取得したい場合にどうすればよいかを見ていきましょう。
<?php $path = './SampleDirectory/index.php'; $result = glob(dirname($path)); var_dump($result); ?>
このように、dirname関数を使ってファイルパスからファイル名を取り除き、ディレクトリ名のみにしたあとにglobを呼び出しています。
こうすることで指定したファイルパスと同階層のファイル名を取得することができます。
まとめ
今回はglob関数を使ってディレクトリ内のファイル名一覧を取得する方法について解説しました。
opendirで取得する方法もありますが、glob関数のほうが簡単であるため特に問題なければglob関数を使うことをおすすめします。
また、glob関数は取得に失敗するとFALSEを返すのでこの点も合わせて覚えておきましょう!