PHP のプログラムで、指定したフォルダ内のファイル一覧を取得したい場面があります。たとえば、オンラインハードディスクのプログラムを作っていたときには、この機能が必要でした。ここでは、この機能を実現できる三つの関数を紹介します。使い方は少しずつ異なります。三つの関数とは、glob、scandir、readdir です。

P.S. ご指摘くださった読者の蒼時弦さん、白目捷さんに感謝します :)

一、glob

個人的には glob をおすすめします。「ワイルドカード文字」を含む文字列を引数に使って、ファイル一覧を取得できます。たとえば ./temp の中に txt ファイルが 5 つ、jpg ファイルが 10 個あるとします。ここで jpg ファイルの一覧だけがほしい場合は、glob('./temp/*.jpg'); と書きます。すると、jpg ファイルの一覧を含む配列が返ります。すべてのファイルを取得したい場合の構文は、glob(./temp/*.*); です。

書式:glob($pattern);

$pattern は……そうですね、フォルダのパスとして理解していただいて問題ありません。前述のとおり、ワイルドカードも使えます。

例:

glob('./temp/*.txt');     //拡張子が txt のファイルだけを取得します
glob('./temp/*.jpg');     //拡張子が jpg のファイルだけを取得します

また、glob の第二引数では配列の並び順を指定できます。詳しくは公式サイトをご覧ください:http://php.net/manual/en/function.glob.php

二、scandir

scandir も便利な関数です。戻り値も配列で、戻り値の最初の要素は「.」(現在のフォルダ)、二番目の要素は「..」(一つ上のフォルダ)です。ただし、glob のようにファイル形式を指定することはできません。scandir の書式は次のとおりです。
scandir($dir_address);
例:
scandir('./temp');
/*
./temp の下にあるすべてのデータを取得します。jpg が 10 個、txt が 5 個含まれます
*/

三、readdir

readdir は、一時期は本当に必要なのかと疑ってしまったほど使いにくい関数です。使い方が面倒で、機能も glob ほど強力ではありません。使うには、まずフォルダを開き(opendir)、そのハンドルを readdir に渡す必要があります。使い終わったら closedir も呼ばなければなりません。この手間に加えて、戻り値は String で、呼び出すたびに一件ずつ読み込みます。つまり、最初の呼び出しでは最初のファイルのデータが、二回目の呼び出しでは二件目のデータが得られます。動作は mysql_fetch_row と同じです。戻り値の形式は scandir と同じく、最初が「.」、二番目が「..」です。

公式ドキュメント:http://php.net/manual/en/function.readdir.php

例:

$handle=opendir('C:UserslinroexDropboxmusic');
while(false!==($file=readdir($handle))){
	echo $file . '';
}

closedir($handle);