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()を使います。