count — 配列/Countableの要素数を返す

PHP
  • カテゴリ: PHP
  • 掲載バージョン: PHP 8.4
  • 名前空間 / FQCN / コマンド: グローバル関数 count
  • 関連: sizeof / is_countable / array_count_values / iterator_count / strlen
  • 変更履歴: PHP 7.3 is_countable() 追加、PHP 8.0 以降は配列/Countable以外を渡すと TypeError を投げる

(php.net, Stack Overflow)

要点(TL;DR)

  • 配列や Countable なオブジェクトの要素数を整数で返す
  • 最低限の使い方:$n = count($items); (php.net)
  • よくある罠
    • null やスカラーを渡すと PHP 8.0+ で TypeError
    • COUNT_RECURSIVE は多次元配列を「合計」する(循環参照は警告)
    • 「空配列判定」に使う前に is_countable()?? [] で安全化

(Stack Overflow, durak.org, php.net)

概要

count() は配列、または Countable を実装したオブジェクトの要素数を返します。多次元配列では第2引数に COUNT_RECURSIVE を指定すると入れ子を含めて総数を数えられます。PHP 8以降は非対応型(例: null)を渡すと TypeError になるため、事前に is_countable() で確認するか、?? [] で配列にフォールバックします。 (php.net, durak.org)

構文 / シグネチャ

function count(array|Countable $value, int $mode = COUNT_NORMAL): int
  • 引数(表)
引数必須既定値説明
$valuearray | Countable要素数を数える対象
$modeintCOUNT_NORMALCOUNT_RECURSIVE を指定すると再帰的に総数をカウント
  • 戻り値int 要素数
  • 例外/副作用
    • TypeError(PHP 8+): $value が配列/Countable 以外
    • 循環参照の再帰カウント時に E_WARNING: Recursion detected を発することがある

(php.net, Stack Overflow)

使用例

最小例

<?php
$items = ['a', 'b', 'c'];
echo count($items); // 3

(php.net)

実務例(POST配列の安全なカウント)

<?php
// チェックボックス 'ids[]' の選択数を数える(未送信/nullでも安全)
$ids = $_POST['ids'] ?? [];     // 未定義やnullなら空配列へ
if (!is_countable($ids)) {      // 想定外の型を弾く(PHP 7.3+)
    throw new InvalidArgumentException('ids must be array or Countable.');
}
$selected = count($ids);
printf("selected=%d\n", $selected);

(php.net)

よくある落とし穴・注意

  • PHP 8+ の厳格化count(null) などは TypeError$var ?? [] で配列化、または is_countable($var) で事前確認。 (Stack Overflow, php.net)
  • COUNT_RECURSIVE の挙動:入れ子要素を合計し、親配列の要素数も含むため「深さ×要素」で増える。循環参照がある場合は警告が出て意図より大きい値になることがある。 (php.net)
  • sizeofcount のエイリアス:意味は同じ。誤解(サイズ=メモリ量)を避けるため count を推奨。 (php.net)
  • 性能:配列の要素数は内部に保持されるため取得は O(1)。ただし Countable 実装次第で重くなる場合があるので、ループ条件に繰り返し書くより変数に保持して使うのが無難。 (php.net)

代替・関連APIとの比較

  • sizeof($x)count() の別名。可読性で count() を選ぶ。 (php.net)
  • is_countable($x):カウント可能か事前に判定(PHP 7.3+)。フォーム入力や外部データの防御に有効。 (php.net)
  • iterator_count($it)Iterator の要素数を数えるが、全走査(消費)する点に注意。
  • array_count_values($arr):値の出現回数を配列で返す(件数そのものではない)。 (php.net)
  • strlen($s):文字列長。count() は文字列には使えない(PHP 8+ では TypeError)。 (Stack Overflow)

テスト例(Pest)

<?php
it('counts array elements', function () {
    expect(count(['a','b','c']))->toBe(3);
});

it('counts recursively', function () {
    $a = [1, [2, 3]];
    expect(count($a, COUNT_RECURSIVE))->toBe(4); // 1 + (2,3)
});

it('throws TypeError on null in PHP 8+', function () {
    $fn = fn() => count(null);
    expect($fn)->toThrow(TypeError::class);
});

(php.net, Stack Overflow)

トラブルシュート(エラー別)

症状/エラー原因対処
`TypeError: count(): Argument #1 ($value) must be of type Countablearray, null given`null やスカラーを渡した
E_WARNING: count(): Recursion detectedCOUNT_RECURSIVE 使用時)循環参照のある配列を再帰カウントデータ構造を修正。必要なら独自の巡回検出で走査
期待より大きい値になる(再帰)親要素 + 子要素の総和になる仕様「トップレベル数」だけなら通常の count() を使う

(Stack Overflow, php.net)

備考(PHPカテゴリ規約)

  • 必要拡張: なし
  • エラー形態: TypeError(PHP 8+)、再帰検出時 E_WARNING
  • エンコーディング注意: なし
  • 8.1/8.2/8.3/8.4差分: PHP 8.0 の厳格化以降、大きな仕様差分なし(TypeError 仕様継続) (Stack Overflow)

参考リンク

  • PHP Manual — count(公式) (php.net)
  • PHP Manual — is_countable(公式) (php.net)
  • PHP Manual — sizeof(公式、count のエイリアス) (php.net)
  • Stack Overflow — PHP 8 の count()TypeError を投げる例 (Stack Overflow)
  • hbgl.dev — 循環配列での COUNT_RECURSIVE 警告 (hbgl)
レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする