【PHP】配列の要素数をカウントする方法|countとCOUNT_RECURSIVE・nullの注意

PHPで配列の要素数を数えるには count() 関数を使います。シンプルですが、ネストした配列の数え方や、null を渡すとPHP 8でエラーになるといった注意点があります。この記事では基本から、つまずきやすいポイントまで解説します。

この記事の結論:要素数は count($array)。入れ子の中身まで全部数えるなら第2引数に COUNT_RECURSIVEnull や配列でない値を渡すとPHP 8では TypeError になるため、count($array ?? []) のように備えます。
スポンサーリンク

count()の基本的な使い方

基本のカウント
<?php
$fruits = ["apple", "banana", "cherry"];
echo count($fruits); // 3

sizeof()count()別名で、動作は同じです。可読性の観点から count() が一般的に使われます。

ネストした配列を全部数える(COUNT_RECURSIVE)

配列の中に配列がある場合、count()最上位の要素数だけを返します。入れ子の中身も含めて数えたいときは第2引数に COUNT_RECURSIVE を指定します。

COUNT_RECURSIVE
<?php
$nested = [
    [1, 2, 3],
    [4, 5, 6],
];

echo count($nested);                   // 2(外側の要素=内側の配列2つ)
echo count($nested, COUNT_RECURSIVE);  // 8
COUNT_RECURSIVE の結果は 8 です(6 ではありません)。内側の要素 3 + 3 = 6 に加えて、外側の配列2つ自身もカウントされるため、2 + 6 = 8 になります。「内側の値だけ」を数えたいわけではない点に注意してください。

注意:nullや非配列を渡すとPHP 8でエラー

変数が配列とは限らない場面で count() を使うときは要注意です。null や文字列など配列でない値を渡すと、PHP 7.2以降は警告、PHP 8.0以降は TypeError になります。

安全にカウントする
<?php
$maybeArray = null;

// NG: PHP 8 では TypeError
// echo count($maybeArray);

// OK: null なら空配列とみなす
echo count($maybeArray ?? []); // 0

// OK: 配列か確認してから
if (is_array($maybeArray)) {
    echo count($maybeArray);
}

条件に合う要素だけ数える

「3より大きい要素の数」のように条件付きで数えるには、array_filter() で絞り込んでから count() します。

array_filter + count
<?php
$numbers = [1, 2, 3, 4, 5];

$filtered = array_filter($numbers, fn($n) => $n > 3);
echo count($filtered); // 2(4 と 5)
array_filter() はキーを保持するため、結果を連番で使いたい場合はarray_values()で振り直してください。配列への要素追加は配列に要素を追加する方法を参照。

よくある質問(FAQ)

QCOUNT_RECURSIVEの結果が想定と違います。
ACOUNT_RECURSIVE内側の要素に加えて、入れ子の配列自身もカウントします。[[1,2,3],[4,5,6]] なら 2(外側)+ 6(内側)= 8 です。内側の値だけを数えるわけではありません。
Qcount(null)でエラーになります。
APHP 8.0以降、null や配列でない値を count() に渡すと TypeError になります。count($x ?? [])is_array() での確認で備えてください。
Qsizeofとcountの違いは?
A違いはありません。sizeof()count()別名です。一般には count() がよく使われます。
Q条件に合う要素の数を数えたいです。
Aarray_filter() で条件に合う要素だけに絞り込み、その結果を count() します。例: count(array_filter($arr, fn($n) => $n > 3))

まとめ

PHPのcount関数のポイントを整理します。

  • 要素数は count($array)sizeof() は別名)
  • 入れ子を全部数えるなら COUNT_RECURSIVE外側の配列自身も数える
  • null・非配列はPHP 8で TypeErrorcount($x ?? [])
  • 条件付きは array_filter()count()

関連として、array_valuesでキーを振り直す方法配列に要素を追加する方法in_arrayで値の存在を確認する方法もあわせて読むと、PHPの配列操作に強くなれます。