Menu

PHPの配列の要素数:count()で長さを取得する

count($arr)はPHPの配列の要素数を返すので、count(['a', 'b', 'c'])は3です。COUNT_RECURSIVEでのネストした配列の数え方、sizeof()とcount()の関係、条件に合う値の数え方、PHP 8以降count(null)がTypeErrorを投げる理由を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

count($arr)は配列の要素数を返します:count(['red', 'green', 'blue'])は3です。PHPの配列にはlengthプロパティがないので、配列の長さや要素数を知るにはcount()を使います。

count()は高速です。PHPは配列の中にサイズを保存しているので、100万個の要素を数えるのも3個を数えるのも同じコストです。

多次元配列を数える

デフォルトでは、count()は最上位の階層だけを数えます。2つ目の引数にCOUNT_RECURSIVE(または1)を渡すと、すべての深さのすべての要素を数えます。ネストした配列そのものも数えられるので、合計は末端の値の数より大きくなることがよくあります。

どちらの近道もちょうど2階層を前提にしています。多次元配列のさらに深いネストでは、array_walk_recursive()で末端を数えます:$n = 0; array_walk_recursive($arr, function () use (&$n) { $n++; });。

countとsizeofの違い

sizeof()はcount()の別名で、引数も結果も同じです。count()を使いましょう。ほぼすべてのPHPのコードとドキュメントがこちらを使っており、sizeofはC言語を知っている人にはバイト単位のサイズを連想させます。

条件に合う値を数える

count()には条件の引数がありません。先に絞り込んでから数えます。array_filter()はコールバックが受け入れた要素を残します。各値が何回現れるかを数えるにはarray_count_values()を使います。

文字列の文字数を数える

count()は配列用です。文字列には、バイト数ならstrlen()、文字数ならmb_strlen()を使います。テキストにアクセント付きの文字や日本語が入ったとたんに、両者の結果は変わります。違いはstrlenのページで扱っています。単語を数えるには、先に分割します。

str_word_count()はASCII以外の文字を区切りとして扱うので、naïveは2語と数えられます。実際のテキストでは、空白で分割するほうが予測しやすい結果になります。

nullや文字列へのcount()は例外を投げる

PHP 8以降、count()は配列とCountableを実装したオブジェクトしか受け付けません。それ以外はTypeErrorを投げます。PHP 7.2から7.4では、警告付きで0(nullの場合)か1(文字列や数値の場合)を返していました。よくある原因は、存在しないキーや何も返さなかった関数のように、ときどきnullになる変数です。

??で値を空の配列にフォールバックすれば、要素数は0になります。

配列が空か確認する

「この配列に何か入っているか」を調べるには、空の配列と比較するかempty()を使います。count($arr) === 0でも判定できますが、$arrが確実に配列である場合に限ります。

empty($x)は$xが未定義やnullでも決して例外を投げないので、配列でないかもしれない値にはより安全な確認方法です。そのほかのルール(空文字列や"0"も空とみなす)はemptyのページにあります。

よくある質問

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

count($arr)を使います。要素数を整数で返すので、count([10, 20, 30])は3です。PHPの配列にはlengthプロパティはありません。

PHPのcountとsizeofの違いは何ですか?

ありません。sizeof()はcount()の別名で、同じ引数を受け取ります。ほとんどのコードはcount()を使い、sizeof()はバイト数を意味するC言語を知っている人を混乱させることがあります。

多次元配列の要素数を数えるには?

count($arr)は最上位の階層だけを数えます。count($arr, COUNT_RECURSIVE)はすべての深さのすべての要素を数え、ネストした配列自体も要素として数えます。

PHP 8でcount()がTypeErrorを投げるのはなぜですか?

PHP 8.0以降、count()は配列とCountableを実装したオブジェクトしか受け付けません。count(null)はTypeError: count(): Argument #1 ($value) must be of type Countable|array, null givenを投げ、count('abc')もstring givenで同じエラーになります。nullかもしれない値にはcount($x ?? [])を、文字列にはstrlen()を使います。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める