PHPでファイル操作を簡単に!glob関数の使い方と応用10選

PHPのglob関数を使ったファイル操作のコード例を示す図PHP
この記事は約9分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

こんにちは、皆さん。

この記事を読めば、PHPでのファイル操作を簡単に行うことができるようになります。

とくに「glob関数」にスポットを当てて、その詳細な使い方から応用テクニックまでを10つの実践的なサンプルコードとともに徹底解説していきます。

PHPでのファイル操作をもっと楽に、もっとスムーズに行いたいという方は、ぜひ最後までご覧ください。

●PHPのglob関数とは

glob関数は、ファイルシステムから特定のパターンにマッチするファイルやディレクトリの名前を取得するための関数です。

正確には、与えられたパターンにマッチするパス名を配列で返します。

○glob関数の基本情報

glob関数は次のような形で使用します。

glob ( string $pattern , int $flags = 0 ) : array

ここで、$patternは検索パターンを指定する引数で、$flagsは各種オプションをビットでORしたものを指定します。

●glob関数の使い方

ここでは、glob関数の基本的な使い方と、その応用例を見ていきましょう。

○サンプルコード1:基本的な使用方法

最も基本的なglob関数の使用方法を見ていきましょう。

$files = glob('*.txt');
print_r($files);

このコードは、現在のディレクトリ内で”.txt”という拡張子を持つ全てのファイルを検索し、その一覧を配列として返します。

この配列をprint_r関数で表示しています。

○サンプルコード2:ワイルドカードを利用する

glob関数ではワイルドカード(*)を用いることで、複数のパターンにマッチするファイルを検索することができます。

$files = glob('*.{txt,php}', GLOB_BRACE);
print_r($files);

このコードでは、”.txt”と”.php”の二つの拡張子を持つファイルを同時に検索します。

そのために、GLOB_BRACEというフラグを指定しています。

これにより、波括弧({})内にカンマ区切りで複数のパターンを指定できます。

次回は、より応用的な使用例を見ていきます。

その際には、glob関数を用いて特定の拡張子のファイルをディレクトリ内から検索する方法や、再帰的にディレクトリを探索する方法などを解説していきます。

●glob関数の応用例

より実践的なglob関数の使用方法を見ていきましょう。

○サンプルコード3:ディレクトリ内の特定の拡張子のファイルを取得

glob関数はディレクトリ内の特定の拡張子を持つファイルを簡単に取得することができます。

例えば、下記のコードでは、”images”ディレクトリ内の”.jpg”拡張子を持つ全てのファイルを取得します。

$files = glob('images/*.jpg');
print_r($files);

このコードを実行すると、”images”ディレクトリ内の全ての”.jpg”ファイルが配列として返されます。

返されるのはファイルのフルパスなので、そのままファイル操作に使うことが可能です。

○サンプルコード4:再帰的にディレクトリを探索

glob関数は再帰的にディレクトリを探索することもできます。

下記のコードでは、”images”ディレクトリ及びそのサブディレクトリ内の全ての”.jpg”ファイルを取得します。

$files = glob('images/**/*.jpg', GLOB_BRACE);
print_r($files);

このコードを実行すると、”images”ディレクトリとそのすべてのサブディレクトリ内の.jpgファイルの一覧が配列として返されます。

○サンプルコード5:複数のパターンを一度に検索

glob関数を使えば、複数のパターンを一度に検索することもできます。

下記のコードでは、”images”ディレクトリ内の”.jpg”と”.png”の2つの拡張子を持つファイルを一度に検索します。

$files = glob('images/*.{jpg,png}', GLOB_BRACE);
print_r($files);

このコードを実行すると、”images”ディレクトリ内の.jpgと.pngの両方の拡張子を持つファイルの一覧が配列として返されます。

○サンプルコード6:フルパスではなくファイル名だけを取得

glob関数はデフォルトでフルパスを返すのですが、ファイル名だけを取得することも可能です。

それには、次のようにbasename関数を使います。

$files = glob('images/*.jpg');
$files = array_map('basename', $files);
print_r($files);

このコードを実行すると、”images”ディレクトリ内の.jpgファイルのファイル名だけが配列として返されます。

○サンプルコード7:ファイルの更新日時順にソート

ファイルの更新日時によってソートすることも可能です。

それには次のようにusort関数を使用します。

$files = glob('images/*.jpg');
usort($files, function($a, $b) {
    return filemtime($a) < filemtime($b);
});
print_r($files);

このコードを実行すると、”images”ディレクトリ内の.jpgファイルが更新日時順(新しい順)にソートされて返されます。

○サンプルコード8:ファイルサイズ順にソート

同様に、ファイルのサイズによってソートすることもできます。

下記のコードは、”images”ディレクトリ内の.jpgファイルをファイルサイズの大きい順にソートします。

$files = glob('images/*.jpg');
usort($files, function($a, $b) {
    return filesize($a) < filesize($b);
});
print_r($files);

このコードを実行すると、”images”ディレクトリ内の.jpgファイルがファイルサイズ順(大きい順)にソートされて返されます。

○サンプルコード9:エラーハンドリング

glob関数が失敗するとFALSEを返すので、エラーハンドリングも簡単に行うことができます。

下記のコードでは、glob関数がFALSEを返した場合にエラーメッセージを表示します。

$files = glob('non_existent_directory/*.jpg');
if ($files === FALSE) {
    echo 'ディレクトリの読み取りに失敗しました。';
} else {
    print_r($files);
}

このコードを実行すると、存在しないディレクトリを指定したため、エラーメッセージが表示されます。

○サンプルコード10:glob関数と他の関数を組み合わせる

glob関数は他の関数と組み合わせて使うことで、さまざまなファイル操作を行うことができます。

下記のコードでは、glob関数とfile_get_contents関数を組み合わせて、”texts”ディレクトリ内の全ての.txtファイルの内容を表示します。

$files = glob('texts/*.txt');
foreach ($files as $file) {
    $content = file_get_contents($file);
    echo $content;
}

このコードを実行すると、”texts”ディレクトリ内の全ての.txtファイルの内容が表示されます。

●glob関数の注意点と対処法

glob関数はその便利さから多くの場面で利用されますが、いくつか注意点が存在します。

○問題点1:大量のファイルを処理するとメモリを大量に消費する

glob関数は全ての結果をメモリに格納します。

そのため、大量のファイルを処理すると大量のメモリを消費する可能性があります。

□対処法1:DirectoryIteratorクラスを使用する

大量のファイルを扱う場合は、代わりにDirectoryIteratorクラスを使用することを検討してみてください。

DirectoryIteratorクラスはファイル一つ一つを順次処理するため、大量のメモリを消費することはありません。

下記のコードは、DirectoryIteratorクラスを用いて、”images”ディレクトリ内の全ての.jpgファイルを取得します。

$iterator = new DirectoryIterator('images');
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile() && $fileinfo->getExtension() == 'jpg') {
        echo $fileinfo->getFilename() . "\n";
    }
}

○問題点2:非ASCII文字を含むパスが正しく処理されない場合がある

非ASCII文字(例:日本語)を含むパスに対してglob関数を使用すると、正しく動作しない場合があります。

□対処法2:mb_convert_encoding関数を使用する

非ASCII文字を含むパスを処理する際は、mb_convert_encoding関数を使用して、パスを適切なエンコーディングに変換します。

下記のコードは、日本語を含むパスに対してglob関数を使用する例です。

$files = glob(mb_convert_encoding('画像ディレクトリ/*.jpg', 'SJIS', 'UTF-8'));
$files = array_map('mb_convert_encoding', $files, array_fill(0, count($files), 'UTF-8'), array_fill(0, count($files), 'SJIS'));
print_r($files);

○問題点3:特殊文字を含むパスが正しく処理されない場合がある

glob関数は、パスに特殊文字(例:* ? [ ])が含まれていると、それをワイルドカードとして解釈します。

そのため、特殊文字を含むパスに対してglob関数を使用すると、予期せぬ動作を引き起こす可能性があります。

□対処法3:特殊文字をエスケープする

特殊文字を含むパスを処理する場合は、特殊文字をエスケープすることで対処します。

下記のコードは、特殊文字を含むパスに対してglob関数を使用する例です。

$path = '特殊[文字]ディレクトリ/*.jpg';
$path = strtr($path, array('[' => '[[]', ']' => '[]]'));
$files = glob($path);
print_r($files);

まとめ

以上が、PHPのglob関数の使い方とその応用についての詳細なガイドでした。

glob関数は非常に強力なツールであり、ファイル操作を簡単に行うことができます。

ただし、その使用には注意が必要であり、特に大量のファイルを扱う場合や非ASCII文字、特殊文字を含むパスを扱う場合には適切な対処法を用いることが重要です。

今回学んだことを忘れずに、PHPでのファイル操作をもっと楽しんでください!