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

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

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

作成日: 更新日:

基本的な使い方

countメソッドは、RecursiveCachingIteratorが内部で保持しているイテレータに含まれる要素の総数を返すメソッドです。このメソッドは、PHPのCountableインターフェースを実装することで提供される機能であり、オブジェクトが持つ要素の数を整数値として取得できます。RecursiveCachingIteratorクラスは、配列や他のイテレータオブジェクトを内包し、キャッシュ機能を追加するラッパークラスとして機能します。そのため、countメソッドが返す値は、この内包された元のイテレータが持つ要素の数となります。例えば、5つの要素を持つ配列から生成したイテレータをRecursiveCachingIteratorでラップした場合、countメソッドを呼び出すと5が返されます。注意点として、このクラス名にはRecursiveとありますが、countメソッドは再帰的に子要素の数を合計するわけではなく、あくまで現在の階層にある要素の数だけを返します。このメソッドは、ループ処理を実行する前に、対象となる要素がいくつあるかを事前に知りたい場合に便利です。

構文(syntax)

1<?php
2
3// 再帰的なイテレータを準備します
4$iterator = new RecursiveArrayIterator(['apple', 'banana', 'cherry']);
5$cachingIterator = new RecursiveCachingIterator($iterator);
6
7// 現在の階層にある要素の数を取得します
8$elementCount = $cachingIterator->count();
9
10echo $elementCount; // 3 が出力されます
11
12?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

現在イテレータが保持している要素の数を整数で返します。

サンプルコード

PHP RecursiveCachingIterator::count() で要素数を取得する

1<?php
2
3// このコードは、RecursiveCachingIterator クラスの count() メソッドの使用例を示します。
4// count() メソッドは、イテレータがキャッシュした要素の総数を返します。
5
6// 1. テスト用のディレクトリとファイルを作成します。
7//    RecursiveCachingIterator が走査する対象として使用します。
8$tempDir = __DIR__ . '/recursive_iterator_test_dir';
9if (!is_dir($tempDir)) {
10    mkdir($tempDir);
11}
12file_put_contents($tempDir . '/file1.txt', 'これはファイル1です。');
13mkdir($tempDir . '/subdir');
14file_put_contents($tempDir . '/subdir/file2.txt', 'これはサブディレクトリ内のファイル2です。');
15
16try {
17    // 2. RecursiveDirectoryIterator を作成します。
18    //    FilesystemIterator::SKIP_DOTS を指定することで、'.' と '..' (現在のディレクトリと親ディレクトリ)
19    //    のエントリをスキップし、実際のファイルやディレクトリのみを対象とします。
20    $directoryIterator = new RecursiveDirectoryIterator($tempDir, FilesystemIterator::SKIP_DOTS);
21
22    // 3. RecursiveCachingIterator で RecursiveDirectoryIterator をラップします。
23    //    これにより、イテレータの要素がキャッシュされ、複数回アクセスしてもパフォーマンスが向上します。
24    //    特に count() メソッドは、内部でイテレータを最後まで進めて要素をキャッシュします。
25    $cachingIterator = new RecursiveCachingIterator($directoryIterator);
26
27    // 4. count() メソッドを呼び出し、キャッシュされた要素の総数を取得します。
28    //    このメソッドはイテレータを最後まで進め、その過程でキャッシュされた全要素の数を返します。
29    $numberOfCachedItems = $cachingIterator->count();
30
31    // 5. 結果を出力します。
32    //    この例では、作成したファイルとディレクトリ('file1.txt', 'subdir', 'subdir/file2.txt')
33    //    の合計3つのエントリが期待されます。
34    echo "RecursiveCachingIterator がキャッシュした要素の総数: " . $numberOfCachedItems . PHP_EOL;
35
36} finally {
37    // 6. テスト用に作成したディレクトリとファイルをクリーンアップします。
38    //    このクロージャ関数は、指定されたディレクトリとその中の全てのファイル・サブディレクトリを再帰的に削除します。
39    $cleanup = function ($dir) use (&$cleanup) {
40        if (is_dir($dir)) {
41            $objects = scandir($dir);
42            foreach ($objects as $object) {
43                if ($object != "." && $object != "..") {
44                    if (is_dir($dir . "/" . $object)) {
45                        $cleanup($dir . "/" . $object);
46                    } else {
47                        unlink($dir . "/" . $object);
48                    }
49                }
50            }
51            rmdir($dir);
52        }
53    };
54    $cleanup($tempDir);
55}
56
57?>

PHPのRecursiveCachingIteratorクラスに属するcount()メソッドは、イテレータが内部にキャッシュしている要素の総数を取得するために使用されます。このメソッドは引数を一切必要とせず、キャッシュされた要素の合計数を整数(int)として返します。

RecursiveCachingIteratorは、繰り返し処理を行うイテレータの要素をキャッシュすることで、特に複数回アクセスする場合や、イテレータの全要素を事前に把握したい場合にパフォーマンスを向上させる目的で利用されます。count()メソッドを呼び出すと、内部でラップしているイテレータを最後まで進め、その過程で全ての要素をキャッシュに保存します。その後、キャッシュに保存された全ての要素の数を正確に数え上げて返します。

サンプルコードでは、まず一時的なディレクトリとファイルを作成し、これをRecursiveDirectoryIteratorで走査します。次に、このディレクトリイテレータをRecursiveCachingIteratorでラップし、そのcount()メソッドを呼び出しています。これにより、指定したディレクトリ内のファイルやサブディレクトリの総数が数えられ、その結果(この例では3つ)が出力されます。この機能は、特定のコレクションやファイルシステムの要素数を効率的に把握したい場合に大変便利です。

RecursiveCachingIterator::count() メソッドは、イテレータを最後まで走査して全ての要素をキャッシュし、その総数を整数で返します。初回呼び出し時は走査コストがかかりますが、一度キャッシュされると以降のアクセスは高速化されます。PHPのグローバルなcount()関数とは異なり、これはRecursiveCachingIteratorオブジェクト専用のメソッドである点に注意してください。サンプルコードのファイル操作では、特にディレクトリやファイルの作成・削除(クリーンアップ)が想定外の場所に影響を与えないよう、パスの指定や実行権限について十分な確認が必要です。

関連コンテンツ