【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 2 3/** 4 * 指定されたシェルパターンに一致するファイルパスを検索します。 5 * 6 * この関数は、ファイルシステム上でワイルドカードパターン(例: `*.php`、`data/*.txt`)を使用して、 7 * 特定の条件に合うファイルやディレクトリを探すPHPの `glob` 関数を利用します。 8 * `glob` 関数は、与えられたパターンに一致する「グローバルな範囲」のファイルパスを返します。 9 * 10 * @param string $pattern 検索するワイルドカードパターン。 11 * @param int $flags glob関数のオプションフラグ(例: `GLOB_BRACE`、`GLOB_ONLYDIR`)。デフォルトは `0`。 12 * @return array 見つかったファイルパスの配列。検索に失敗した場合は空の配列を返します。 13 */ 14function findFilesByPattern(string $pattern, int $flags = 0): array 15{ 16 // glob関数を使って、指定されたパターンに一致するファイルパスを検索します。 17 // PHP 8では、検索に失敗した場合に `false` を返す可能性があります。 18 $foundFiles = glob($pattern, $flags); 19 20 // 検索が失敗した場合(例: 権限不足、不正なパターンなど)、`false` が返されます。 21 // 初心者にも分かりやすいように、エラー時は空の配列を返します。 22 if ($foundFiles === false) { 23 // 実際にはエラーログへの記録など、より詳細なエラーハンドリングが推奨されます。 24 return []; 25 } 26 27 // 検索結果として得られたファイルパスの配列を返します。 28 return $foundFiles; 29} 30 31// --- サンプル使用例 --- 32 33// 例1: 現在のディレクトリにあるすべてのPHPファイルを検索します。 34// 実行前に、このスクリプトと同じディレクトリに `example.php` などのPHPファイルを作成しておくと、 35// 動作を確認できます。 36echo "現在のディレクトリにあるPHPファイルを検索:\n"; 37$phpFiles = findFilesByPattern('*.php'); 38if (!empty($phpFiles)) { 39 foreach ($phpFiles as $file) { 40 echo "- " . $file . "\n"; 41 } 42} else { 43 echo " PHPファイルは見つかりませんでした。\n"; 44} 45 46echo "\n"; 47 48// 例2: 現在のディレクトリにあるすべてのテキストファイルを検索します。 49// 実行前に、`readme.txt` などのテキストファイルを作成しておくと、動作を確認できます。 50echo "現在のディレクトリにあるテキストファイルを検索:\n"; 51$textFiles = findFilesByPattern('*.txt'); 52if (!empty($textFiles)) { 53 foreach ($textFiles as $file) { 54 echo "- " . $file . "\n"; 55 } 56} else { 57 echo " テキストファイルは見つかりませんでした。\n"; 58} 59 60echo "\n"; 61 62// 例3: 特定のディレクトリ(例: 'data')内のCSVファイルを検索します。 63// 実行前に、`data/` ディレクトリを作成し、その中に `sales.csv` などのCSVファイルを作成しておくと、 64// 動作を確認できます。 65echo "特定のディレクトリ('data/')内のCSVファイルを検索:\n"; 66$csvFilesInDataDir = findFilesByPattern('data/*.csv'); 67if (!empty($csvFilesInDataDir)) { 68 foreach ($csvFilesInDataDir as $file) { 69 echo "- " . $file . "\n"; 70 } 71} else { 72 echo " 'data/' ディレクトリにCSVファイルは見つかりませんでした。\n"; 73}
PHPのglob関数は、シェルで利用されるワイルドカードパターン(例: *.php や data/*.txt)を使って、ファイルシステム上で特定の条件に合うファイルやディレクトリのパスを検索する機能を提供します。これは、指定されたパターンに一致する「グローバルな範囲」のファイルパスを見つける際に役立ちます。
引数 $pattern には、検索したいファイルパスのワイルドカードパターンを文字列で指定します。例えば、*.php は現在のディレクトリにあるすべてのPHPファイルを意味します。オプションの $flags 引数には、GLOB_ONLYDIR のように検索動作を詳細に制御するための追加オプションを整数値で渡すことができます。
関数が正常に実行されると、パターンに一致したファイルパスが格納された配列が戻り値として返されます。しかし、PHP 8では、検索の失敗(例えば、アクセス権限の問題や不正なパターン)が発生した場合、falseが返されることがあります。
提供されたサンプルコードでは、findFilesByPattern という関数を通じて glob を利用し、glob が false を返した場合でも、より扱いやすい空の配列を返すようにエラー処理を加えています。具体例として、現在のディレクトリにあるPHPファイルやテキストファイルを検索する方法、また特定の data ディレクトリ内にあるCSVファイルを検索する方法が示されており、glob関数の実用的な使い方を理解するのに役立ちます。
glob関数は、指定されたワイルドカードパターンに一致するファイルパスを検索します。この関数は、検索に失敗した場合にfalseを返すため、サンプルコードのように戻り値がfalseでないかを必ず確認し、適切にエラー処理を行うことが重要です。パターンには*や?などのワイルドカードを使用し、絶対パスまたは相対パスでファイルを指定できます。
大量のファイルを検索するとシステムのパフォーマンスに影響を与える可能性がありますので注意が必要です。また、ユーザーからの入力をパターンに直接使用すると、意図しないファイルへのアクセスや情報漏洩のリスクがあるため、入力値の厳格な検証とサニタイズを必ず行ってください。
PHP glob関数とGLOBALSでファイル検索とグローバル変数操作
1<?php 2 3/** 4 * 現在のディレクトリから特定のパターンに一致するファイルを検索し、 5 * その結果を$GLOBALSスーパーグローバル配列に格納します。 6 * $GLOBALS配列の使用例を通じて、PHPのグローバル変数の扱方を示します。 7 */ 8function searchAndStoreFilesGlobally(): void 9{ 10 // $GLOBALSスーパーグローバル配列に検索パターンを定義します。 11 // この変数はスクリプトのどこからでもアクセス可能です。 12 $GLOBALS['searchPattern'] = "*.txt"; 13 14 // $GLOBALSから定義した検索パターンを取得します。 15 $pattern = $GLOBALS['searchPattern']; 16 17 // glob関数を使用して、指定されたパターンに一致するファイルをファイルシステムから検索します。 18 // glob関数は一致するファイルパスの配列を返すか、エラー時にfalseを返します。 19 $foundFiles = glob($pattern); 20 21 if ($foundFiles === false) { 22 // glob関数がエラーを返した場合の処理です。 23 echo "エラー: ファイル検索中に問題が発生しました。\n"; 24 // エラー時は$GLOBALSに空の配列を格納し、後で状態を確認できるようにします。 25 $GLOBALS['lastFoundFiles'] = []; 26 } elseif (empty($foundFiles)) { 27 // パターンに一致するファイルが見つからなかった場合の処理です。 28 echo "情報: '{$pattern}' に一致するファイルは見つかりませんでした。\n"; 29 // ファイルが見つからなかった場合も$GLOBALSに空の配列を格納します。 30 $GLOBALS['lastFoundFiles'] = []; 31 } else { 32 // ファイルが見つかった場合の処理です。 33 echo "見つかったファイル ({$pattern}):\n"; 34 foreach ($foundFiles as $file) { 35 echo "- " . $file . "\n"; 36 } 37 // 見つかったファイルリストを$GLOBALSスーパーグローバル配列に格納します。 38 // これにより、この関数の外からでも結果にアクセスできるようになります。 39 $GLOBALS['lastFoundFiles'] = $foundFiles; 40 } 41} 42 43// ファイル検索関数を実行します。 44// この関数内で$GLOBALS変数が設定されます。 45searchAndStoreFilesGlobally(); 46 47echo "\n--- 関数実行後のグローバル変数アクセス --- \n"; 48 49// 関数が終了した後、$GLOBALS配列に格納された検索結果にアクセスします。 50// これがグローバル変数へのアクセス方法の一例です。 51if (!empty($GLOBALS['lastFoundFiles'])) { 52 echo "グローバル変数 \$GLOBALS['lastFoundFiles'] の内容:\n"; 53 foreach ($GLOBALS['lastFoundFiles'] as $file) { 54 echo " [GLOBAL ACCESS] " . $file . "\n"; 55 } 56} else { 57 echo "グローバル変数 \$GLOBALS['lastFoundFiles'] にファイルは格納されていません。\n"; 58} 59 60// グローバルに設定された検索パターンも確認できます。 61echo "設定された検索パターン: " . $GLOBALS['searchPattern'] . "\n"; 62 63?>
このPHPサンプルコードは、ファイルシステムから特定のパターンに一致するファイルを検索するglob関数と、スクリプトのどこからでもアクセス可能な$GLOBALSスーパーグローバル変数の使い方を示しています。glob関数は、第一引数に指定したファイルパターン(例: "*.txt")に合致するファイルやディレクトリのパスを文字列の配列として返します。検索に失敗した場合はfalseを返しますが、第二引数$flagsを適切に指定することで検索挙動を細かく制御できます。
コード内のsearchAndStoreFilesGlobally関数では、検索パターンを$GLOBALS['searchPattern']に設定し、glob関数でファイルを検索します。$GLOBALSはPHPに標準で備わる特殊な配列で、スクリプトのどの場所からでも変数を読み書きできるため、関数内から設定した値を関数の外で利用できます。検索結果は$GLOBALS['lastFoundFiles']に格納され、関数実行後にこのグローバル変数にアクセスすることで、見つかったファイルリストを確認できる仕組みです。これにより、関数とグローバルスコープ間でデータを効果的に共有する方法を学ぶことができます。
glob関数はワイルドカードを用いてファイルシステムから特定のファイルを検索する便利な機能ですが、検索パターンにユーザーからの入力値を直接使用すると、意図しないファイルへのアクセスなどセキュリティ上のリスクが生じる可能性があるため注意が必要です。また、処理が失敗した際にはfalseを返すため、必ず戻り値をチェックし、適切なエラー処理を実装してください。
このサンプルコードでは$GLOBALSスーパーグローバル配列を活用していますが、これはスクリプトのどこからでもアクセスできるため、多用するとコードの可読性や保守性を著しく低下させる可能性があります。変数のスコープが広すぎると、どの場所で変数の値が変更されたか追跡が困難になり、予期せぬバグの原因となることがあります。通常は、関数の引数や戻り値を使ってデータをやり取りすることを推奨します。$GLOBALSの使用は特定の状況に限定し、慎重に行うようにしてください。
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関数を適用できるため、効率的なコードになります。