指定したディレクトリ内のファイル名を一覧で取得したい場合、PHPにはglob()という関数があります。
引数にはディレクトリ名を指定するのですが、ワイルドカード(*)が使えるのでディレクトリ内のファイル名やサブディレクトリ名を取得することができます。
ただ指定したディレクトリ内の一覧を取得するだけでなく、ちょっとした小細工も試してみました。
glob() は引数で指定したパターンに一致するパスの一覧を返す関数です。
引数に指定する内容で取得できるものが変わってきます。
PHPで指定したディレクトリ内のファイル名とディレクトリ名一覧取得
glob() の引数にディレクトリ名を入れると、そのディレクトリ内の全てのファイル名とディレクトリ名を返してくれます。
例えば、あるPHPファイルと同じ階層に「images」というディレクトリを作成し、画像を配置したとします。
その場合は次のように書きます。
1 |
$res = glob('images/*'); |
images/* の / (スラッシュ) は、ディレクトリの区切り文字です。
Windowsで言う¥と同じようなものです。
images/ と書くことで、imagesディレクトリの中という意味になります。
そこに、* をつけることで、「全て」という意味を加えで、「imagesディレクトリの中の全て」になります。
$res を var_dump() で出力すると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
array(5) { [0]=> string(15) "images/neko.jpg" [1]=> string(17) "images/neko02.jpg" [2]=> string(17) "images/neko03.jpg" [3]=> string(17) "images/neko04.jpg" [4]=> string(10) "images/sub" } |
最後の要素の「images/sub」はディレクトリです。
全てのファイルとディレクトリが取得できました。
指定したディレクトリ内のディレクトリ名だけ取得
上の例ではファイル名とディレクトリ名を全て取得していました。
次はファイル名は無しでディレクトリ名だけ取得してみます。
やり方は簡単で、第2引数にオプションを設定できるのですが、そこに GLOB_ONLYDIR を設定するだけです。
1 2 |
$res = glob('./images/*', GLOB_ONLYDIR); var_dump($res); |
結果は次のようになります。
1 2 3 4 |
array(1) { [0]=> string(12) "./images/sub" } |
結果がディレクトリだけになりました。
拡張子を指定してファイル名取得
拡張子を指定して、マッチしたファイルのファイル名を取得する方法です。
例えば images ディレクトリ内の jpg のファイルだけを取得します。
1 2 |
$res = glob('./images/*.jpg'); var_dump($res); |
指定する拡張子が複数ある場合は、オプションに GLOB_BRACE を使います。
GLOB_BRACE は複数の条件を指定でき、{a,b,c}のように書くと、条件aもしくは条件bもしくは条件cのようになります。
1 2 |
$res = glob('./images/{*.jpg,*.jpeg,*.png}', GLOB_BRACE); var_dump($res); |
上のように書けば、jpgとjpeg、pngの3つの拡張子のファイルを出力することができます。
今回は拡張子を指定しましたが、複数のディレクトリでも可能です。
1 |
$res = glob('{dir1/*,dir2/*}', GLOB_BRACE); |
サブディレクトリも含め全てのファイル名を取得
指定したディレクトリの中のディレクトリ(サブディレクトリ)の中もまとめて一覧表示したい場合の方法です。
この場合、サブディレクトリの中に更にサブディレクトリがあるかもしれません。
そういう場合は繰り返して掘り下げていく感じですが、こういうのを再帰的って言うんでしたっけ?ぶっちゃけこういう言葉覚えるの苦手なんです(笑)
その掘り下げる方法に関してももっといい方法があるかもしれませんが、僕なりに作成してみたので参考にどうぞ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function globAll($ptn) { // 指定されたディレクトリを出力 echo $ptn . "<br />"; // 指定されたディレクトリ内の一覧を取得 $res = glob($ptn.'/*'); // 一覧をループ foreach ($res as $f) { // is_file() を使ってファイルかどうかを判定 if (is_file($f)) { // ファイルならそのまま出力 echo $f . "<br />"; } else { // ディレクトリの場合(ファイルでない場合)は再度globAll()を実行 globAll($f); } } } // 最初にディレクトリを指定する globAll('images'); |
面倒ですが、1つ関数(globAll)を作成して、結果の一覧の要素がファイルで無い場合は再度関数を実行するといった内容です。
とくにテストもしていないので自己責任でコピーしてください。
まとめ
ファイル名やディレクトリ名を一覧で取得するには glob() が便利です。
拡張子を指定する方法や、ディレクトリだけ取得する方法、サブディレクトリも掘り下げて一覧を取得する方法など紹介しましたが、他にも気になることがあればご質問ください。
はじめまして、原口と申します。
突然のメッセージ失礼いたします。
webで記事を拝見してDMいたしました。
僕は過去300都市を旅している旅好きなんですが、自分の経験から、個人旅行のUXってもっと良くできるのでは、と思って起業して旅行のサービスを立ち上げています。
アプリ・webサービス開発中なのですが、旅好きのエンジニアの方と組みたいなと思っており、
ブログを見て、突然で恐縮ですがメッセージ致しました。
もし宜しければ、一度お茶かランチでもいかがでしょうか?
下記のようなエンジニア募集をしています。
現在10名程度のProjectで、副業エンジニアが2名います。
https://www.wantedly.com/projects/277962
ぜひ宜しくお願いします!
原口 剛嘉
https://www.facebook.com/takayoshi.haraguchi