PHP の配列長を count() と sizeof() で数える

PHP の配列長は配列の要素数を指し、取得には count() を使うのが標準です。PHP 配列の要素数は count($array)(同じ関数へのエイリアスである sizeof($array) でも可)で取得できます。count() は添字配列でも連想配列でも最上位の要素数を返します。ネストした構造では COUNT_RECURSIVE がサブ配列も数えるため、その挙動が必要なときだけ使ってください。

要素数を数える PHP 配列長の例

出力:

ここに出力が表示されます...

出力:

3

この例の仕組み

  1. $colors は3つの文字列要素を持つ添字配列です。
  2. count($colors)3 を返します。これは最上位要素の合計です。連想配列でも同じで、count() が数えるのは値ではなくキーです。
  3. 空配列では 0 が返るため、count() はゼロ比較と組み合わせることで空判定にも使えます。

PHP で配列長を取得する方法

PHP の配列には .length プロパティがありません。count() 関数が配列長を取得する標準手段で、Countable を実装したオブジェクトにも使えます。戻り値は常に int です。PHP 8.0+ では、count() できない値に count() を呼ぶと TypeError が発生するため、値が配列とは限らない場合は is_countable() で先に判定してください。

PHP の count() でよくある間違い

count() ではなく strlen() を使ってしまう

悪い例:

$items = ["a", "b", "c"];
echo strlen($items); // PHP 8+ では TypeError

正しい例:

echo count($items); // 3

strlen() が測るのは文字列のバイト長であり、配列要素数ではありません。

数えられない値に count() を呼ぶ

悪い例:

$maybeArray = "abc";
echo count($maybeArray); // PHP 8+ では TypeError

正しい例:

$length = is_countable($maybeArray) ? count($maybeArray) : 0;
echo $length;

値がスカラーや null の可能性があるなら、数える前に is_countable() を確認してください。

PHP の count()sizeof() の違い

count()sizeof()
PHP マニュアルで正規の関数として記載される。count() のエイリアスで、挙動も性能も同一。
ほぼすべての PHP コードベースで意味が通じる。C/C++ の sizeof(バイトサイズ取得)と混同されやすい。

新規コードでは count() を使ってください。sizeof() は互換性のために存在しますが、追加の利点はなく、他言語経験者を誤解させる可能性があります。

COUNT_NORMALCOUNT_RECURSIVE の違い

$groups = ["果物" => ["りんご", "なし"], "色" => ["赤"]];

echo count($groups);                    // 2(最上位キー)
echo count($groups, COUNT_RECURSIVE);   // 5(キー2つ + 値3つ)

COUNT_NORMAL(既定値、値は 0)は最上位要素だけを数えます。COUNT_RECURSIVE(値は 1)は入れ子の配列をたどり、含まれる要素を合計に加算します。循環参照を含む配列を再帰カウントすると警告が発生します。 COUNT_RECURSIVE は、サブ配列を要素として数える仕様が用途に合う場合にだけ使ってください。葉ノードの値だけを数えるわけではありません。

FAQ

PHP で配列長を取得するには?

要素数を取得するには count($array) を呼びます。添字配列、連想配列、Countable を実装したオブジェクトで使えます。空配列なら 0 を返します。

count() は連想配列でも使えますか?

はい。count() はキーが数値か文字列かに関係なくキー数を数えます。count(["a" => 1, "b" => 2])2 を返します。

PHP 8 で配列以外を count() に渡すとどうなりますか?

PHP 8.0+ では、文字列・整数・null・通常オブジェクトのような count 不可な値に対して TypeError が発生します。PHP 7.2+ では警告を出しつつ、スカラーに 1null0)を返していたため、バグを見逃しやすい挙動でした。