Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】GlobIterator::count()メソッドの使い方

countメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

countメソッドは、GlobIteratorオブジェクトが、指定されたグローバル(glob)パターンに一致するファイルまたはディレクトリの総数を取得するメソッドです。 このメソッドはGlobIteratorクラスに属しており、PHPの標準インターフェースであるCountableを実装しています。そのため、通常の配列やオブジェクトに対してcount()関数を使用するのと同じように、GlobIteratorオブジェクトをcount()関数に渡すことで、このcountメソッドが内部的に呼び出され、条件に合致する要素の数が返されます。 countメソッドは、イテレータが実際に反復処理を行う前に、指定したglobパターン(例えば*.logimages/*.pngなど)に合致するファイルやディレクトリがいくつ存在するのかを事前に把握したい場合に特に役立ちます。これにより、ファイルやディレクトリの存在確認、処理対象の件数を事前に把握して条件分岐を行う、あるいは進行状況を示す際などに利用できます。 戻り値は、条件に一致したファイルおよびディレクトリの総数を示す整数値です。 例えば、new GlobIterator('/path/to/files/*.txt')といった形で作成されたイテレータに対してcount()関数を適用すると、/path/to/filesディレクトリ内のすべての.txtファイルの数を正確に取得できます。 ファイルシステムのコンテンツを効率的に管理・操作するための、非常に便利な機能の一つです。

構文(syntax)

1<?php
2
3$iterator = new GlobIterator('*.txt');
4count($iterator);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

GlobIterator::count メソッドは、グローバリゼーションパターンに一致したファイルおよびディレクトリの総数を整数型(int)で返します。

サンプルコード

PHP GlobIterator::count でファイル数を取得する

1<?php
2
3/**
4 * GlobIterator::count メソッドの使用例を示します。
5 *
6 * この関数は、一時ディレクトリを作成し、テストファイルを配置し、
7 * GlobIterator を使用して特定のパターンに一致するファイルの数をカウントし、結果を表示します。
8 * 特に、パターンに一致するファイルが存在しない場合の count メソッドの動作に焦点を当てています。
9 * 最後に、作成した一時ファイルをクリーンアップします。
10 */
11function demonstrateGlobIteratorCount(): void
12{
13    // 一時ディレクトリを作成し、テストファイルを準備します。
14    // ユニークなディレクトリ名を使用し、他のプロセスとの衝突を避けます。
15    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'glob_test_' . uniqid();
16    if (!mkdir($tempDir) && !is_dir($tempDir)) {
17        echo "エラー: 一時ディレクトリの作成に失敗しました。\n";
18        return;
19    }
20
21    // テスト用のファイルを作成します。
22    $file1 = $tempDir . DIRECTORY_SEPARATOR . 'example1.txt';
23    $file2 = $tempDir . DIRECTORY_SEPARATOR . 'log_file.log';
24    $file3 = $tempDir . DIRECTORY_SEPARATOR . 'another_example.txt';
25
26    file_put_contents($file1, 'Test content for example1');
27    file_put_contents($file2, 'Log content');
28    file_put_contents($file3, 'More content for another_example');
29
30    echo "--- テストファイル準備完了 ---\n";
31    echo "一時ディレクトリ: " . $tempDir . "\n";
32    echo "作成されたファイル: " . basename($file1) . ", " . basename($file2) . ", " . basename($file3) . "\n\n";
33
34    // 1. "*.txt" パターンでファイルを検索し、数をカウントします。
35    // 期待される結果: 2 (example1.txt, another_example.txt)
36    try {
37        $txtFilesIterator = new GlobIterator($tempDir . DIRECTORY_SEPARATOR . '*.txt');
38        $txtCount = $txtFilesIterator->count(); // count メソッドを呼び出します
39        echo "パターン '*.txt' に一致するファイルの数: " . $txtCount . " 件\n";
40    } catch (UnexpectedValueException $e) {
41        // GlobIterator のコンストラクタは、無効なパスやパターンに対して例外を投げることがあります。
42        echo "エラー(.txt パターン): " . $e->getMessage() . "\n";
43    }
44
45    echo "\n";
46
47    // 2. "*.csv" パターンでファイルを検索し、数をカウントします。
48    // このパターンに一致するファイルは存在しないため、count() は 0 を返します。
49    // これは、PHPの一般的な count() 関数が null や空の配列に対して 0 を返すのと同様に、
50    // 「要素が存在しない状態」を 0 として安全に表現することを示しています。
51    try {
52        $csvFilesIterator = new GlobIterator($tempDir . DIRECTORY_SEPARATOR . '*.csv');
53        $csvCount = $csvFilesIterator->count(); // count メソッドを呼び出します
54        echo "パターン '*.csv' に一致するファイルの数: " . $csvCount . " 件\n";
55        if ($csvCount === 0) {
56            echo "  (このパターンに一致するファイルは存在しません。GlobIterator::count() は 0 を返します。)\n";
57        }
58    } catch (UnexpectedValueException $e) {
59        echo "エラー(.csv パターン): " . $e->getMessage() . "\n";
60    }
61
62    echo "\n";
63
64    // 3. "*" (全てのファイル) パターンでファイルを検索し、数をカウントします。
65    // 期待される結果: 3 (example1.txt, log_file.log, another_example.txt)
66    try {
67        $allFilesIterator = new GlobIterator($tempDir . DIRECTORY_SEPARATOR . '*');
68        $allCount = $allFilesIterator->count(); // count メソッドを呼び出します
69        echo "パターン '*' (全てのファイル) に一致するファイルの数: " . $allCount . " 件\n";
70    } catch (UnexpectedValueException $e) {
71        echo "エラー(全ファイルパターン): " . $e->getMessage() . "\n";
72    }
73
74    // クリーンアップ: 作成したファイルを削除し、一時ディレクトリを削除します。
75    echo "\n--- クリーンアップ中 ---\n";
76    if (file_exists($file1)) {
77        unlink($file1);
78    }
79    if (file_exists($file2)) {
80        unlink($file2);
81    }
82    if (file_exists($file3)) {
83        unlink($file3);
84    }
85    // ディレクトリが空であることを確認してから削除します。
86    if (is_dir($tempDir) && count(glob($tempDir . DIRECTORY_SEPARATOR . '*')) === 0) {
87        rmdir($tempDir);
88    } else {
89        echo "警告: ディレクトリが空ではないか、削除に失敗しました: " . $tempDir . "\n";
90    }
91    echo "クリーンアップ完了。\n";
92}
93
94// demonstrateGlobIteratorCount 関数を実行します。
95demonstrateGlobIteratorCount();

GlobIterator::countメソッドは、ファイルシステム上で特定のパターンに一致するファイルの数を数えるために使用されます。このメソッドは引数を必要とせず、パターンに合致するファイルの総数を整数値で返します。

サンプルコードでは、まず一時ディレクトリを作成し、複数のテストファイルを配置する準備をします。その後、GlobIteratorクラスをインスタンス化し、ファイルシステムパスとファイルパターン(例: *.txt)を指定して、特定の条件に一致するファイルを検索します。

count()メソッドを呼び出すことで、このパターンに合致するファイルの数が取得され、その結果が表示されます。特に注目すべきは、検索パターンに一致するファイルが一つも存在しない場合でも、count()メソッドは安全に0を返す点です。これは、PHPの一般的なcount()関数が空のコレクションに対して0を返すのと同様に、要素が存在しない状態を適切に表現する挙動です。最後に、作成した一時ファイルとディレクトリは丁寧に削除され、環境をクリーンな状態に戻します。このコードは、ファイル検索と数え上げの実用的な例として、システムの運用や管理に役立つ基礎的な操作を示しています。

GlobIterator::count()メソッドは、指定パターンに一致するファイルの数を整数で返します。ファイルが見つからない場合でも、エラーではなく安全に0が返されるため、戻り値がnullになる心配はありません。これはPHPの一般的なcount()関数の挙動と同様です。ただし、GlobIteratorのコンストラクタに無効なパスやパターンを渡すとUnexpectedValueExceptionが発生する可能性があるため、try-catchブロックで適切に例外を処理することが重要です。また、サンプルコードのように一時ファイルやディレクトリを使用する際は、必ず最後にクリーンアップを行い、システムリソースを適切に管理する習慣をつけましょう。

PHP GlobIterator::count()でファイル数を数える

1<?php
2
3// このサンプルコードは、PHPのGlobIterator::count() メソッドの基本的な使い方を示します。
4// システムエンジニアを目指す初心者が、ファイルシステムを走査するイテレータが取得した要素の数を数える方法を理解できるように作成されています。
5
6// --------------------------------------------------------------------------------
7// 1. テスト環境の準備: 一時ディレクトリと一時ファイルの作成
8//    GlobIterator が数える対象となるファイルを作成します。
9// --------------------------------------------------------------------------------
10
11// OSの一時ディレクトリパスを取得し、ユニークな名前でテスト用ディレクトリを作成します。
12// これにより、他のファイルに影響を与えることなく安全にテストを実行できます。
13$tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'glob_test_' . uniqid();
14
15// テスト用ディレクトリが存在しない場合は作成します。
16if (!is_dir($tempDir)) {
17    mkdir($tempDir, 0777, true); // 0777はディレクトリのパーミッション、trueは再帰的な作成を許可
18    echo "一時テストディレクトリを作成しました: {$tempDir}\n";
19} else {
20    echo "一時テストディレクトリは既に存在します: {$tempDir}\n";
21}
22
23// テスト用の一時ファイルの名前リストを定義します。
24$fileNamesToCreate = [
25    'document_01.txt',
26    'document_02.txt',
27    'image_01.jpg',
28    'data.log',
29    'document_03.txt',
30    'report.pdf',
31];
32
33echo "一時ディレクトリ '{$tempDir}' にテストファイルを作成中...\n";
34foreach ($fileNamesToCreate as $fileName) {
35    $filePath = $tempDir . DIRECTORY_SEPARATOR . $fileName;
36    // ファイルに簡単な内容を書き込みます。
37    file_put_contents($filePath, "これはテストファイルです: {$fileName}");
38    echo "  - 作成: {$fileName}\n";
39}
40
41// --------------------------------------------------------------------------------
42// 2. GlobIterator::count() メソッドの使用
43//    指定したパターンに一致するファイルの数を数えます。
44// --------------------------------------------------------------------------------
45
46// GlobIterator で検索するファイルパターンを定義します。
47// この例では、作成した一時ディレクトリ内の全ての '.txt' ファイルを対象とします。
48$searchPattern = $tempDir . DIRECTORY_SEPARATOR . '*.txt';
49echo "\nGlobIterator でパターン '{$searchPattern}' に一致するファイルを検索します。\n";
50
51try {
52    // GlobIterator のインスタンスを作成します。
53    // コンストラクタに検索したいファイルパターンを渡します。
54    // GlobIterator は PHP の SPL (Standard PHP Library) の一部で、
55    // ファイルシステムを走査するための強力なイテレータです。
56    $iterator = new GlobIterator($searchPattern);
57
58    // count() メソッドを呼び出して、イテレータが保持する要素の数(一致したファイルの数)を取得します。
59    // GlobIterator は IteratorAggregate インターフェースを実装しており、
60    // その count() メソッドはイテレータが返す要素の総数を整数 (int) で返します。
61    $numberOfMatches = $iterator->count();
62
63    echo "GlobIterator::count() で数えられた一致ファイルの数: {$numberOfMatches} 個\n";
64
65} catch (Exception $e) {
66    // エラーが発生した場合の処理
67    error_log("GlobIterator の使用中にエラーが発生しました: " . $e->getMessage());
68    echo "エラーが発生しました。詳細はログを確認してください。\n";
69} finally {
70    // --------------------------------------------------------------------------------
71    // 3. クリーンアップ: 作成した一時ファイルとディレクトリの削除
72    //    このサンプルコードが実行環境に不要なファイルやディレクトリを残さないようにします。
73    // --------------------------------------------------------------------------------
74    echo "\nテスト後に作成した一時ファイルとディレクトリをクリーンアップ中...\n";
75
76    // 作成したファイルを一つずつ削除します。
77    foreach ($fileNamesToCreate as $fileName) {
78        $filePath = $tempDir . DIRECTORY_SEPARATOR . $fileName;
79        if (file_exists($filePath)) {
80            unlink($filePath);
81            echo "  - 削除: {$fileName}\n";
82        }
83    }
84
85    // ディレクトリが空になったら削除します。
86    // scandir() は隠しファイル '.' と '..' を含むため、空のディレクトリは要素数2となります。
87    if (is_dir($tempDir) && count(scandir($tempDir)) === 2) {
88        rmdir($tempDir);
89        echo "一時ディレクトリ '{$tempDir}' を削除しました。\n";
90    } else {
91        echo "一時ディレクトリ '{$tempDir}' は空ではないか、削除できませんでした。\n";
92    }
93}
94
95?>

PHP 8のGlobIterator::count()メソッドは、ファイルシステム上で特定のパターンに一致するファイルやディレクトリの数を効率的に取得するために利用される重要な機能です。このメソッドはGlobIteratorクラスに属しており、引数を一切取らずに呼び出すことができ、一致した要素の総数を整数(int)として返します。

システムエンジニアを目指す初心者にとって、ディレクトリ内の特定の種類のファイルがいくつあるか、あるいは処理対象のファイル数を事前に把握することは、システム開発や運用における基本的なタスクの一つです。サンプルコードでは、まず一時的なテストファイルをいくつか作成し、GlobIteratorが数を数える対象となる環境を準備します。

次に、new GlobIterator($searchPattern)として特定のファイルパターン(例えば、*.txtのようにワイルドカードを含むパターン)を指定してGlobIteratorのインスタンスを生成します。このGlobIteratorは、指定されたパターンに合致するすべてのファイルやディレクトリの情報を内部的にリストアップする役割を担います。

その後、生成されたイテレータオブジェクトに対して$iterator->count()を呼び出すだけで、イテレータが内部に保持している要素、つまり検索パターンに一致するファイルの正確な数を簡単に取得できます。この機能は、特定の拡張子のファイル数を確認したり、ログファイルの生成数を把握したりする際に非常に役立ちます。サンプルコードの最後に記述されているクリーンアップ処理は、テスト後に作成した不要なファイルを適切に削除する良い実践例でもあります。

GlobIterator::count()は、指定したファイルパターンに一致するファイルやディレクトリの数を整数で取得するメソッドです。PHPの一般的なcount()関数とは異なり、GlobIteratorオブジェクトに対して呼び出す点に注意しましょう。サンプルコードのように一時ファイルを作成する処理を含む場合、実行環境を汚染しないよう、必ずファイルやディレクトリを削除するクリーンアップ処理を記述することが非常に重要です。また、ファイルパスを構築する際には、OSに依存しないようにDIRECTORY_SEPARATOR定数を使用する習慣をつけましょう。堅牢なコードのため、エラー処理のtry-catch-finallyブロックを活用することをお勧めします。

関連コンテンツ