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

【PHP8.x】COUNT_RECURSIVE定数の使い方

COUNT_RECURSIVE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

COUNT_RECURSIVE定数は、PHPの組み込み関数であるcount()(およびsizeof())関数で、配列やオブジェクトの要素数を数える際の挙動を制御するために使用される定数です。通常、count()関数は配列の第一階層にある要素の数のみを数えます。例えば、ネストされた配列がある場合でも、直下の要素しかカウントせず、内部の配列の要素は数えません。

しかし、COUNT_RECURSIVE定数をcount()関数の第二引数として指定すると、その挙動が変更されます。この定数を使用すると、count()関数は多次元配列などのネストされた構造において、内部の配列やオブジェクトの要素もすべて再帰的に含めて合計の要素数を計算するようになります。これにより、階層的なデータ構造全体の総要素数を正確に把握することが可能になります。

この機能は、複雑な設定情報やデータベースから取得した多次元データなど、階層を持つデータの要素数を網羅的に取得したい場合に非常に便利です。COUNT_RECURSIVE定数の値は整数型の「1」と等価であり、count()関数のオプションフラグとして機能します。システム開発において、データの分析や処理を行う際に、配列の総要素数を正確に取得するために活用される、重要な定数の一つです。

構文(syntax)

1<?php
2$array = [1, [2, 3], 4];
3$recursiveCount = count($array, COUNT_RECURSIVE);
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP配列のCOUNT_RECURSIVEで全要素を数える

1<?php
2
3/**
4 * COUNT_RECURSIVE 定数を使った配列の要素数カウントの例
5 *
6 * COUNT_RECURSIVE は、count() 関数の第2引数に指定することで、
7 * 多次元配列(配列の中に配列がある構造)の要素を再帰的に、つまり
8 * 配列の階層を深く辿って全ての要素を数えるように指示する定数です。
9 *
10 * 初心者でも理解しやすいように、通常のカウントと再帰的なカウントの結果の違いを示します。
11 */
12
13// 多次元配列を定義します。
14// これは、配列の中にさらに配列を含む構造を持つデータです。
15$multiDimensionalArray = [
16    'fruits' => ['apple', 'banana', 'orange'], // 3つのフルーツ
17    'vegetables' => ['carrot', 'potato'],     // 2つの野菜
18    'grains' => 'rice',                       // 単一の文字列要素
19    'dairy' => [                              // 乳製品の配列
20        'milk',
21        'cheese' => ['cheddar', 'gouda']      // チーズの配列(さらにネスト)
22    ]
23];
24
25// PHP推奨コーディングスタイルでは、直接 echo でHTMLタグを出力することも一般的です。
26echo "<h3>配列の要素数を数える例</h3>";
27echo "<pre>"; // 整形済みテキストとして表示するために <pre> タグを使用します。
28
29// --- 1. 通常の count() 関数を使用する例(非再帰的) ---
30// count() 関数を第2引数なしで呼び出すと、配列の「トップレベル」の要素のみを数えます。
31// この場合、'fruits', 'vegetables', 'grains', 'dairy' の4つの要素が数えられます。
32// 'fruits', 'vegetables', 'dairy' の中身は数えられません。
33$countNormal = count($multiDimensionalArray);
34echo "<h4>通常の count() (非再帰):</h4>";
35echo "結果: " . $countNormal . "個\n";
36echo "数えられた要素:\n";
37echo "  - 'fruits' (これは配列ですが、全体で1つの要素としてカウントされます)\n";
38echo "  - 'vegetables' (これも配列ですが、全体で1つの要素としてカウントされます)\n";
39echo "  - 'grains'\n";
40echo "  - 'dairy' (これも配列ですが、全体で1つの要素としてカウントされます)\n";
41echo "\n";
42
43
44// --- 2. COUNT_RECURSIVE 定数を使った count() 関数を使用する例(再帰的) ---
45// count() 関数の第2引数に COUNT_RECURSIVE を指定すると、
46// 配列の全ての階層にある要素を「再帰的に」数え上げます。
47// つまり、サブ配列の中身も個別の要素としてカウントされます。
48//
49// 数えられる要素の内訳:
50// - トップレベルの要素: 'fruits', 'vegetables', 'grains', 'dairy' (4個)
51// - 'fruits' 配列内の要素: 'apple', 'banana', 'orange' (3個)
52// - 'vegetables' 配列内の要素: 'carrot', 'potato' (2個)
53// - 'dairy' 配列内の要素: 'milk', 'cheese' (2個)
54// - 'cheese' 配列内の要素: 'cheddar', 'gouda' (2個)
55// 合計: 4 + 3 + 2 + 2 + 2 = 13個
56$countRecursive = count($multiDimensionalArray, COUNT_RECURSIVE);
57echo "<h4>COUNT_RECURSIVE を使用した count() (再帰的):</h4>";
58echo "結果: " . $countRecursive . "個\n";
59echo "数えられた要素:\n";
60echo "  - トップレベルの各要素\n";
61echo "  - 'fruits' 配列内の各要素\n";
62echo "  - 'vegetables' 配列内の各要素\n";
63echo "  - 'dairy' 配列内の各要素\n";
64echo "  - 'cheese' 配列内の各要素\n";
65
66echo "</pre>";
67
68?>

PHPのCOUNT_RECURSIVEは、配列の要素数を数えるcount()関数で使用する定数です。この定数をcount()関数の第2引数に指定すると、多次元配列(配列の中にさらに配列が含まれる構造)の要素を再帰的に、つまり配列の全ての階層を深く辿って数え上げることができます。

通常のcount()関数は、配列のトップレベルの要素のみを数えます。例えば、サンプルコードの$multiDimensionalArrayでは、通常のcount()を実行すると4つの要素が数えられます。これは、'fruits', 'vegetables', 'grains', 'dairy'という4つのキーに対応する要素です。一方、COUNT_RECURSIVEを第2引数に指定した場合、'fruits'配列内の各フルーツや、'dairy'配列内の乳製品、さらにその中のチーズの種類まで、全ての内部要素が個別に数えられます。このサンプルでは合計13個の要素が数えられ、多次元配列の全ての構成要素を把握できます。

COUNT_RECURSIVE定数自体には引数や戻り値はありません。これはcount()関数の動作モードを「再帰的」に切り替えるための指示として機能します。結果として、count()関数は数えられた要素の総数を整数値として返します。この定数は、多次元配列の正確な総要素数を取得したい場合に非常に有用です。

COUNT_RECURSIVEは、count()関数を多次元配列に対して再帰的に要素数を数えるように指示する定数です。通常のcount()は配列のトップレベル要素のみを数えるため、COUNT_RECURSIVEを第2引数に指定すると、ネストされた配列の中身もすべて個別の要素としてカウントされ、結果が大きく異なりますので注意が必要です。再帰的なカウントでは、配列そのものも要素として数え上げられるため、予想よりもカウントされる要素が多くなる点も誤解しやすいポイントです。どのような要素数を取得したいのかを明確にし、適切に使い分けてください。PHP 8で安全に利用できます。

PHP COUNT_RECURSIVE で配列を再帰カウントする

1<?php
2
3/**
4 * COUNT_RECURSIVE定数の使用例を示します。
5 *
6 * この定数は、count() 関数 (および sizeof() 関数) の第2引数として使用され、
7 * 多次元配列のすべての要素を再帰的に数えるように指示します。
8 * PHP 8 で動作します。
9 */
10function demonstrateCountRecursive(): void
11{
12    // 多次元配列の例を定義します。
13    // この配列は、文字列と、さらに内部に配列を持つ構造です。
14    $multiDimensionalArray = [
15        'apple',
16        'banana',
17        [ // この配列自体が1つの要素とみなされます
18            'cherry',
19            'date',
20            [ // この配列自体も1つの要素とみなされます
21                'elderberry'
22            ]
23        ],
24        'fig'
25    ];
26
27    echo "--- 多次元配列の要素数カウントの例 ---\n\n";
28
29    // 1. COUNT_RECURSIVE を使用しない通常のカウント
30    // 最上位の要素のみをカウントします。
31    // 'apple', 'banana', (内部配列), 'fig' の合計4つの要素が数えられます。
32    $countWithoutRecursive = count($multiDimensionalArray);
33    echo "1. 通常のカウント (COUNT_RECURSIVEなし):\n";
34    echo "  最上位の要素数: " . $countWithoutRecursive . "\n\n";
35    // 出力例: 4
36
37    // 2. COUNT_RECURSIVE を使用した再帰的なカウント
38    // 配列内のすべての要素(サブ配列そのものと、その中の要素)を再帰的に数え上げます。
39    // 各配列自体も1つの要素としてカウントされます。
40    // 計算の内訳:
41    // - 最上位の要素: 'apple', 'banana', [cherry,...], 'fig' (4要素)
42    // - 2番目の階層の配列: 'cherry', 'date', [elderberry] (3要素)
43    // - 3番目の階層の配列: 'elderberry' (1要素)
44    // 合計: 4 + 3 + 1 = 8要素
45    $countWithRecursive = count($multiDimensionalArray, COUNT_RECURSIVE);
46    echo "2. 再帰的なカウント (COUNT_RECURSIVEを使用):\n";
47    echo "  すべての要素数 (配列自身も含む): " . $countWithRecursive . "\n\n";
48    // 出力例: 8
49
50    // COUNT_RECURSIVE 定数自体の値を確認することもできますが、通常は count() 関数の引数として直接使用します。
51    echo "COUNT_RECURSIVE 定数の値: " . COUNT_RECURSIVE . "\n";
52    // 出力例: 1 (通常は整数値 1 が割り当てられています)
53}
54
55// 定数の使用例を示す関数を実行します。
56demonstrateCountRecursive();
57

COUNT_RECURSIVEは、PHP 8で利用できる組み込みの定数です。この定数自体には引数や戻り値はありませんが、主にcount()関数(またはsizeof()関数)の第2引数として使用され、多次元配列の要素数を再帰的に数える挙動を制御します。

通常のcount()関数は、配列の最上位の要素のみをカウントします。例えば、サンプルコードで定義された$multiDimensionalArrayでは、「'apple'」「'banana'」「内部の配列そのもの」「'fig'」という合計4つの要素が数えられます。

一方、count()関数の第2引数にCOUNT_RECURSIVEを指定すると、配列内のすべての要素を階層を辿って再帰的に数え上げます。この際、内部に含まれる配列そのものも1つの要素としてカウントの対象となります。サンプルコードの場合、「'apple'」「'banana'」「(最初の)内部配列」「'fig'」に加えて、最初の内部配列内の「'cherry'」「'date'」「(2番目の)内部配列」、そして2番目の内部配列内の「'elderberry'」も数えられ、合計で8つの要素がカウントされます。

このようにCOUNT_RECURSIVEは、多次元配列のすべての要素を網羅的に数えたい場合に非常に役立つ定数です。

このサンプルコードで示されるCOUNT_RECURSIVEは、count()関数(またはsizeof()関数)の第2引数として指定し、多次元配列のすべての要素を再帰的に数える際に使用する定数です。特に注意すべき点は、内部にあるサブ配列そのものも「1つの要素」としてカウントされることです。これにより、最上位の要素数のみを数える通常のカウントとは異なる結果となるため、期待する要素数と合致しているか、配列の構造と合わせて確認することが非常に大切です。この定数はPHP 8で利用可能ですが、それ以前のPHPバージョンでは挙動が異なる可能性があるため、実行環境にご注意ください。配列に含まれる全ての値の個数を把握したい場合に役立ちます。

関連コンテンツ