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

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

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

作成日: 更新日:

基本的な使い方

countメソッドは、RecursiveArrayIteratorオブジェクトが持つ要素の数を返すメソッドです。このメソッドはPHPのCountableインターフェースを実装しており、オブジェクトに対してcount()関数が使用された際に内部的に呼び出されます。RecursiveArrayIteratorは多次元配列などを再帰的に走査するために設計されたイテレータですが、このcountメソッドが返すのは、イテレータが現在対象としている配列の第一階層にある要素の数のみです。これは、対象の配列に対して直接PHPの組み込み関数count()を実行した場合と全く同じ結果となります。注意点として、このメソッドは再帰的に全ての要素を数え上げるわけではありません。もし配列の中に別の配列(子配列)が含まれている場合、その子配列は1つの要素としてカウントされ、その内部の要素数は合計に含まれません。したがって、多次元配列全体の総要素数を取得したい場合は、別途再帰的な処理を記述する必要があります。このメソッドの戻り値は、要素数を表す整数値です。

構文(syntax)

1<?php
2
3// 多次元配列
4$fruits = [
5    'citrus' => ['orange', 'lemon'],
6    'berry' => ['strawberry', 'raspberry']
7];
8
9// RecursiveArrayIteratorのインスタンスを作成
10$iterator = new RecursiveArrayIterator($fruits);
11
12// 現在の階層にある要素の数を数える
13// この場合、'citrus' と 'berry' の2つ
14$count = $iterator->count();
15
16// 結果を出力 (出力: 2)
17echo $count;
18
19?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このメソッドは、再帰的に配列を走査する際の現在の要素数を整数型(int)で返します。

サンプルコード

PHP RecursiveArrayIterator::count() は null も数える

1<?php
2
3/**
4 * RecursiveArrayIterator の count() メソッドの動作を示す関数。
5 * null 値を含む配列で RecursiveArrayIterator を使用し、
6 * count() メソッドがどのように要素数を数えるかを確認します。
7 * RecursiveArrayIterator::count() は、null 値も配列の要素としてカウントします。
8 */
9function demonstrateRecursiveArrayIteratorCount(): void
10{
11    // null 値を含む様々な要素を持つ配列を準備します。
12    $data = [
13        1,          // 整数
14        null,       // null 値も配列の要素として扱われます
15        'hello',    // 文字列
16        [4, 5],     // ネストされた配列もトップレベルでは1つの要素です
17        null,       // 別の null 値
18        true,       // 真偽値
19    ];
20
21    echo "元の配列:\n";
22    print_r($data);
23    echo "\n";
24
25    // RecursiveArrayIterator のインスタンスを作成します。
26    // これにより、配列の要素をイテレート(順次処理)できるようになります。
27    $iterator = new RecursiveArrayIterator($data);
28
29    // count() メソッドを呼び出して、イテレータが持つトップレベルの要素数を取得します。
30    // RecursiveArrayIterator::count() は、null 値を含め、配列の最上位にあるすべての要素を数えます。
31    $elementCount = $iterator->count();
32
33    echo "RecursiveArrayIterator::count() で数えられた要素数: " . $elementCount . "\n";
34    echo "(この例では null 値が2つ含まれていますが、それらも要素としてカウントされ、合計6が返されます。)\n";
35}
36
37// 関数を実行して、動作を確認します。
38demonstrateRecursiveArrayIteratorCount();

RecursiveArrayIterator::count()メソッドは、PHP 8で提供されるRecursiveArrayIteratorクラスに属する機能です。このメソッドは引数を一切取らず、イテレータが現在保持している配列のトップレベルの要素数を整数(int)で返します。

このメソッドの重要な特徴として、PHPの一般的なcount()関数がnull単体を数えないのに対し、RecursiveArrayIterator::count()は配列の要素として含まれるnull値も有効な要素としてカウントします

サンプルコードでは、整数、null値、文字列、ネストされた配列、真偽値など、多様な要素を含む配列が準備されています。この配列には2つのnull値が含まれています。RecursiveArrayIteratorのインスタンスを作成し、そのcount()メソッドを呼び出すと、null値を含め、配列の最上位にあるすべての要素が数えられます。結果として、サンプルコードでは合計6という整数が返されます。これは、RecursiveArrayIteratornull値も配列の構成要素として区別なく扱うことを明確に示しており、配列の全体構造を正確に把握したい場合に非常に役立ちます。

このサンプルコードが示すように、RecursiveArrayIterator::count()メソッドは、配列内のnull値を他のデータ型と同様に有効な要素として数え上げます。そのため、null値を要素としてカウントしたくない場合は、事前にarray_filter()などを用いてnull値を除去するか、別途条件分岐で処理を行う必要があります。このメソッドは、配列の最上位(トップレベル)にある要素のみを数えるため、ネストされた配列が存在する場合でも、それは1つの要素としてカウントされます。意図通りの要素数を取得するには、null値の扱いと、トップレベル要素のみを数えるという挙動を理解しておくことが重要です。

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

1<?php
2
3/**
4 * RecursiveArrayIterator::count() メソッドの使用例。
5 *
6 * このメソッドは、RecursiveArrayIterator オブジェクトが現在イテレートしている
7 * レベルの要素の数を返します。再帰的な構造の深部にある要素は直接カウントしません。
8 *
9 * システムエンジニアを目指す初心者の方へ:
10 * PHPのcount()関数とは異なり、このcount()メソッドはRecursiveArrayIterator
11 * という特殊なオブジェクトに属しています。このオブジェクトは、配列を効率的に
12 * 巡回(イテレート)するために使われます。
13 */
14
15// サンプルデータとなる配列を準備します。
16// この配列には、ネストされた配列(サブ配列)も含まれています。
17$dataArray = [
18    'fruit_a' => 'apple',
19    'fruit_b' => 'banana',
20    'colors' => [
21        'red',
22        'green',
23        'blue',
24    ],
25    'fruit_c' => 'cherry',
26];
27
28// RecursiveArrayIterator のインスタンスを作成します。
29// これにより、$dataArray をイテレータ(巡回可能なオブジェクト)として扱えるようになります。
30$iterator = new RecursiveArrayIterator($dataArray);
31
32// count() メソッドを呼び出して、イテレータが持つ最上位の要素の数を取得します。
33// ここでは、$dataArray の最上位キーの数('fruit_a', 'fruit_b', 'colors', 'fruit_c' の4つ)が返されます。
34$numberOfItems = $iterator->count();
35
36// 取得した要素数を表示します。
37echo "イテレータが持つ最上位の要素数: " . $numberOfItems . "\n";
38
39// 例外的なケースとして、空の配列の場合の動作も確認します。
40$emptyArray = [];
41$emptyIterator = new RecursiveArrayIterator($emptyArray);
42$numberOfEmptyItems = $emptyIterator->count();
43
44echo "空のイテレータが持つ最上位の要素数: " . $numberOfEmptyItems . "\n";
45
46// 補足: もし配列内の全ての(ネストされたものを含む)要素をカウントしたい場合は、
47// RecursiveArrayIterator と RecursiveIteratorIterator を組み合わせて使う必要があります。
48// RecursiveArrayIterator::count() は、あくまでそのイテレータが直接管理する要素の数を返します。
49
50?>

RecursiveArrayIterator::count()は、PHPの特殊なオブジェクトであるRecursiveArrayIteratorに属するメソッドです。これは引数を持たず、現在のイテレータが管理する要素の数を整数(int)で返します。

システムエンジニアを目指す初心者の方へ: PHPには配列の要素数を数えるcount()関数がありますが、このcount()メソッドはそれとは異なります。RecursiveArrayIteratorは、ネストされた配列のような複雑なデータ構造を効率的に巡回(イテレート)するために使われるクラスです。

このcount()メソッドは、イテレータが現在処理している「レベル」の要素のみをカウントします。例えば、多次元配列を扱っている場合でも、ネストされたサブ配列の内部にある要素は直接数えません。サンプルコードでは、$dataArrayの最上位にあるキー('fruit_a', 'fruit_b', 'colors', 'fruit_c')の数である「4」を返します。'colors'内の要素はカウントされません。また、空の配列を元に作成されたイテレータに対しては「0」を返します。

もし、配列内のネストされた要素も含め、全ての要素を再帰的にカウントしたい場合は、RecursiveArrayIteratorだけでなく、RecursiveIteratorIteratorなどの別のクラスと組み合わせて利用する必要があります。このRecursiveArrayIterator::count()メソッドは、あくまでそのイテレータが直接管理する要素数を確認する際に用います。

RecursiveArrayIterator::count()メソッドは、PHPの一般的なcount()関数とは異なり、RecursiveArrayIteratorオブジェクト専用の機能であることに注意が必要です。このメソッドは、イテレータが現在処理している配列の最上位レベルの要素数のみをカウントし、ネストされた配列の内部までは数えません。そのため、配列全体の要素数(ネストされたものを含む)を知りたい場合は、このメソッド単独では目的を達成できません。その際は、RecursiveIteratorIteratorと組み合わせて利用することを検討してください。このメソッドは引数を取らず、常に整数値の要素数を返します。

関連コンテンツ

【PHP8.x】RecursiveArrayIterator::count()メソッドの使い方 | いっしー@Webエンジニア