【PHP8.x】glob関数の使い方
glob関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
glob関数は、指定されたパターンにマッチするファイルやディレクトリを検索し、その結果を配列として返す関数です。ファイルシステムから特定の条件に合致するファイルを探し出す際に非常に役立ちます。
第一引数には、検索したいパターンを文字列で指定します。このパターンには、ワイルドカード文字(*, ?, []など)を使用して、柔軟なファイル名指定が可能です。例えば、*.txtと指定すると、拡張子が.txtのすべてのファイルが検索対象となります。
第二引数には、オプションのフラグを指定できます。これらのフラグを使用することで、glob関数の動作を細かく制御できます。例えば、GLOB_ONLYDIRフラグを指定すると、ディレクトリのみを検索対象にできます。GLOB_NOSORTフラグを指定すると、結果をソートせずに返すため、パフォーマンスが向上する場合があります。GLOB_BRACEフラグを使用すると、{}で囲まれた複数のパターンを同時に検索できます。
glob関数は、ファイルシステムの操作を行うため、実行する環境によっては権限が必要となる場合があります。また、指定されたパターンにマッチするファイルが大量にある場合、メモリを大量に消費する可能性があるため、注意が必要です。
戻り値は、マッチしたファイルまたはディレクトリ名の配列です。マッチするファイルが存在しない場合は、空の配列を返します。エラーが発生した場合は、falseを返します。エラー発生時には、ファイルシステムの権限や、指定したパスが存在するかどうかなどを確認してください。
構文(syntax)
1glob(string $pattern, int $flags = 0): array|false
引数(parameters)
string $pattern, int $flags = 0
- string $pattern: 検索するファイル名のパターンを指定する文字列。ワイルドカード(
*,?,[])が使用できます。 - int $flags = 0: 検索の挙動を変更するためのフラグを指定する整数。デフォルトは0(フラグなし)です。
戻り値(return)
array|false
指定されたパターンに一致するファイルパスの配列を返します。一致するファイルがない場合は false を返します。
サンプルコード
PHP globでファイル一覧を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたディレクトリ内に、特定のパターンに一致するファイルパスのリストを取得して表示します。 7 * この関数は自己完結しており、実行時にテスト用のディレクトリとファイルを自動で作成・削除します。 8 * 9 * @return void 10 */ 11function findFilesByPattern(): void 12{ 13 // --- 準備: サンプル用のディレクトリとファイルを作成 --- 14 $sampleDir = 'test_directory'; 15 if (!is_dir($sampleDir)) { 16 mkdir($sampleDir); 17 } 18 file_put_contents($sampleDir . '/user_01.log', 'log data'); 19 file_put_contents($sampleDir . '/system_info.log', 'log data'); 20 file_put_contents($sampleDir . '/README.md', 'readme'); 21 file_put_contents($sampleDir . '/config.ini', 'config data'); 22 echo "テスト用のディレクトリとファイルを作成しました: {$sampleDir}/\n"; 23 echo "----------------------------------------\n"; 24 25 26 // --- glob()関数の使用例 --- 27 // ワイルドカード '*' を使用して、指定したディレクトリ内の拡張子が.logの全ファイルを検索します。 28 // '*' は任意の文字列にマッチします。 29 $pattern = $sampleDir . '/*.log'; 30 echo "検索パターン: \"{$pattern}\"\n\n"; 31 32 // glob()はパターンに一致したファイルパスの配列を返します。 33 // 一致するファイルがない場合やエラーが発生した場合は false を返します。 34 $foundFiles = glob($pattern); 35 36 // --- 結果の処理 --- 37 if ($foundFiles === false) { 38 // エラーが発生した場合 39 echo "ファイルの検索中にエラーが発生しました。\n"; 40 } elseif (empty($foundFiles)) { 41 // マッチするファイルが一つも見つからなかった場合 42 echo "パターンに一致するファイルは見つかりませんでした。\n"; 43 } else { 44 // マッチするファイルが見つかった場合 45 echo "見つかったファイル一覧:\n"; 46 foreach ($foundFiles as $file) { 47 echo "- " . $file . "\n"; 48 } 49 } 50 51 // --- 後片付け: 作成したディレクトリとファイルを削除 --- 52 echo "----------------------------------------\n"; 53 // glob() を使って削除対象のファイルリストを取得し、unlinkで一括削除 54 array_map('unlink', glob($sampleDir . '/*')); 55 rmdir($sampleDir); 56 echo "テスト用のディレクトリとファイルを削除しました。\n"; 57} 58 59// 作成した関数を実行します 60findFilesByPattern(); 61
このサンプルコードは、PHPのglob関数を使い、特定のパターンに一致するファイルパスのリストを取得する方法を示しています。glob関数は、ファイルシステム上にあるファイルやディレクトリを、ワイルドカードなどを含むパターンで検索する際に使用します。
関数の最初の引数には、検索パターンとなる文字列を渡します。この例では'test_directory/*.log'がそれに該当します。アスタリスク*は任意の文字列を表すワイルドカードであり、このパターンは「test_directoryというディレクトリの中にある、拡張子が.logの全てのファイル」を意味します。
戻り値は、パターンに一致したファイルパスを要素とする配列です。一致するファイルが見つからなかった場合は空の配列が、エラーが発生した場合はfalseが返されます。そのため、サンプルコードではif文を使って、戻り値がfalseや空の配列である場合を判別し、適切に処理を分岐させています。見つかった場合は、foreachループを使って配列内のファイルパスを一つずつ取り出し、画面に表示しています。このように、特定のルールに合致するファイルを一括で扱いたい場合に便利な関数です。
glob()関数は、指定したパターンに一致するファイルパスを配列で取得します。注意点として、この関数はエラー時にfalseを返す一方、一致するファイルがない場合は空の配列を返します。そのため、サンプルコードのように=== falseという厳密な比較でエラーを判定し、empty()で結果の有無を確認することが重要です。また、ワイルドカード*はサブディレクトリ内のファイルまでは検索しません。ユーザーからの入力をパターンに使う際は、意図しないファイルが参照される危険があるため、必ず検証や無害化を行ってください。最後に、このglob()関数は、名前が似ているグローバル変数を扱うためのglobalキーワードとは全く別の機能である点も覚えておきましょう。
PHP globでファイル名のみ取得する
1<?php 2declare(strict_types=1); 3 4/** 5 * 指定したパターンに一致するファイルの「ファイル名のみ」を配列で取得します。 6 * 7 * glob()は通常、ディレクトリパスを含む完全なパスを返しますが、 8 * この関数は basename() を使ってファイル名部分だけを抽出します。 9 * 10 * @param string $pattern 検索パターン (例: 'data/*.txt') 11 * @return array<string>|false パターンに一致したファイル名の配列。一致するファイルがない場合やエラー時は false を返します。 12 */ 13function getFilenamesOnly(string $pattern): array|false 14{ 15 // glob() を使ってパターンに一致するファイルのパスを配列として取得 16 $paths = glob($pattern); 17 18 // エラーが発生した場合や、一致するファイルがなかった場合 19 if ($paths === false || count($paths) === 0) { 20 return false; 21 } 22 23 // array_map() を使い、取得したパスの配列の各要素に対して basename() を適用し、 24 // ファイル名のみを抽出した新しい配列を生成します。 25 // 例: '/path/to/file.txt' -> 'file.txt' 26 return array_map('basename', $paths); 27} 28 29// --- 以下、サンプルコードの実行部分 --- 30 31// 1. 動作確認用に一時的なディレクトリとファイルを作成します 32$tempDir = __DIR__ . '/temp_glob_test'; 33if (!is_dir($tempDir)) { 34 mkdir($tempDir); 35} 36touch($tempDir . '/image_01.jpg'); 37touch($tempDir . '/document.txt'); 38touch($tempDir . '/image_02.png'); 39touch($tempDir . '/photo_final.jpg'); 40 41// 2. 作成したディレクトリ内の .jpg ファイル名のみを取得 42$pattern = $tempDir . '/*.jpg'; 43$filenames = getFilenamesOnly($pattern); 44 45// 3. 結果を出力します 46if ($filenames !== false) { 47 echo "指定したパターンに一致したファイル名一覧:\n"; 48 print_r($filenames); 49} else { 50 echo "指定したパターンに一致するファイルは見つかりませんでした。\n"; 51} 52 53// 4. 後片付けとして、作成した一時ファイルを削除します 54array_map('unlink', glob($tempDir . '/*')); 55rmdir($tempDir); 56 57/* 58実行結果の例: 59 60指定したパターンに一致したファイル名一覧: 61Array 62( 63 [0] => image_01.jpg 64 [1] => photo_final.jpg 65) 66*/
このサンプルコードは、PHPのglob関数を利用して、指定したパターンに一致するファイルの「ファイル名だけ」を配列で取得する方法を解説します。
glob関数は、引数 $pattern で指定された検索パターン(例: 'data/*.txt')に一致するファイルやディレクトリのパスを配列で返します。しかし、この関数が返す値は、通常 'data/document.txt' のようにディレクトリ名を含む完全なパスです。
そこで、ファイル名のみを抽出するためにgetFilenamesOnlyという独自の関数を定義しています。この関数は、内部でまずglob関数を呼び出してパスの配列を取得します。次に、array_map関数を使い、取得した配列の各要素(パス文字列)に対してbasename関数を適用します。basename関数は、パス文字列からファイル名の部分だけを取り出す機能を持っています。この処理によって、パスの配列がファイル名のみの配列へと変換されます。
戻り値として、処理が成功すればファイル名の配列を返します。パターンに一致するファイルが見つからない場合や、何らかのエラーが発生した場合にはfalseを返します。
glob関数は、指定したパターンに一致するファイルのパスを配列で返します。重要な注意点として、このパスは「ディレクトリ名を含むフルパス」であるため、ファイル名だけが必要な場合はサンプルコードのようにbasename関数を使って抽出する必要があります。また、glob関数の戻り値は、一致するファイルがない場合は空の配列、エラーが発生した場合はfalseとなります。そのため、if ($paths === false)のようにfalseかどうかを厳密にチェックすることが大切です。このチェックを怠ると、予期せぬエラーの原因になります。array_map関数を使うと、配列の各要素に一括でbasename関数を適用できるため、効率的なコードになります。