- カテゴリ: 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を投げる
要点(TL;DR)
- 配列や
Countableなオブジェクトの要素数を整数で返す - 最低限の使い方:
$n = count($items);(php.net) - よくある罠
nullやスカラーを渡すと PHP 8.0+ でTypeErrorCOUNT_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
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| $value | array | Countable | ✓ | — | 要素数を数える対象 |
| $mode | int | COUNT_NORMAL | COUNT_RECURSIVE を指定すると再帰的に総数をカウント |
- 戻り値:
int要素数 - 例外/副作用:
TypeError(PHP 8+):$valueが配列/Countable 以外- 循環参照の再帰カウント時に
E_WARNING: Recursion detectedを発することがある
使用例
最小例
<?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)sizeofはcountのエイリアス:意味は同じ。誤解(サイズ=メモリ量)を避けるため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);
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| `TypeError: count(): Argument #1 ($value) must be of type Countable | array, null given` | null やスカラーを渡した |
E_WARNING: count(): Recursion detected(COUNT_RECURSIVE 使用時) | 循環参照のある配列を再帰カウント | データ構造を修正。必要なら独自の巡回検出で走査 |
| 期待より大きい値になる(再帰) | 親要素 + 子要素の総和になる仕様 | 「トップレベル数」だけなら通常の count() を使う |
備考(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)

