PHPで開発を進める際、配列の要素数を取得する操作は非常に頻繁に行われます。
PHPには配列の要素数を数えるための標準関数としてcount関数が用意されています。
初心者から上級者まで、この関数の正しい使い方を理解しておくことは、バグの少ない効率的なコードを書くために不可欠です。
本記事では、2026年現在の最新のPHP環境におけるcount関数の基本動作から、多次元配列への対応、注意すべき挙動までを詳しく解説します。
PHPのcount関数とは
PHPのcount関数は、配列やCountableインターフェースを実装したオブジェクトの要素数を取得するための組み込み関数です。
ウェブアプリケーションの開発において、データベースから取得したデータの件数を確認したり、ループ処理の回数を決定したりする際に多用されます。
非常にシンプルな関数ですが、渡す引数の型やオプションによって戻り値が変化するため、仕様を正確に把握しておくことが重要です。
基本的な構文は、count(mixed $value, int $mode = COUNT_NORMAL)となります。
count関数の基本的な使い方
最も一般的な使い方は、1次元の配列を引数に渡してその要素数を取得する方法です。
次のコード例では、数値添字配列と連想配列の要素数を取得しています。
<?php
// 数値添字配列の定義
$fruits = ['apple', 'banana', 'orange'];
// 要素数を取得
$countFruits = count($fruits);
echo "果物の数は " . $countFruits . " 個です。";
?>
果物の数は 3 個です。
連想配列の場合でも、同様にキーと値のペアの数をカウントします。
<?php
// 連想配列の定義
$user = [
'id' => 1,
'name' => '田中',
'email' => 'tanaka@example.com'
];
echo "ユーザー情報の項目数は " . count($user) . " です。";
?>
ユーザー情報の項目数は 3 です。
sizeof関数との違い
PHPにはcount関数と全く同じ動作をするsizeofという関数も存在します。
実のところ、sizeofはcountの別名(エイリアス)であり、機能的な違いは一切ありません。
どちらを使用しても結果は同じですが、PHP公式ドキュメントや多くのフレームワークではcountの使用が推奨されています。
コードの可読性や一貫性を保つために、プロジェクト内ではcountに統一することをおすすめします。
多次元配列における要素数のカウント
配列の中にさらに配列が含まれている「多次元配列」の場合、単純にcountを使用すると直下の要素数のみがカウントされます。
しかし、第2引数を指定することで、再帰的にすべての要素をカウントすることが可能です。
再帰的なカウント(COUNT_RECURSIVE)
count関数の第2引数には、カウントのモードを指定できます。
デフォルトはCOUNT_NORMAL(または0)で、これは多次元配列の深い階層を無視します。
一方で、COUNT_RECURSIVE(または1)を指定すると、すべての階層の要素を合計した数が返されます。
<?php
$categories = [
'Fruits' => ['Apple', 'Banana'],
'Vegetables' => ['Carrot', 'Potato', 'Onion']
];
// 通常のカウント
$normalCount = count($categories);
// 再帰的なカウント
$recursiveCount = count($categories, COUNT_RECURSIVE);
echo "通常カウント: " . $normalCount . "\n";
echo "再帰カウント: " . $recursiveCount . "\n";
?>
通常カウント: 2
再帰カウント: 7
再帰的なカウントでは、「Fruits」「Vegetables」という親要素(2つ)と、その中身(5つ)を足した合計の7が返されている点に注意してください。
多次元配列での注意点
COUNT_RECURSIVEを使用する場合、多次元構造そのものもカウントに含まれるため、純粋な「末端のデータ数」だけを知りたい場合には工夫が必要です。
また、循環参照(配列の中に自分自身が含まれているような構造)がある場合、無限ループに近い挙動やエラーを引き起こすリスクがあります。
複雑なデータ構造を扱う際は、標準のcount関数ではなく、自作の再帰関数やarray_walk_recursiveを検討することもあります。
PHP 8.x以降でのcount関数の厳格化
近年のPHPバージョンアップに伴い、count関数の挙動はより厳格になっています。
以前の古いPHPバージョンでは、配列以外の値を渡してもエラーにならずに「1」や「0」を返すことがありました。
しかし、現在のPHP 8.0以降では、カウント不可能な値を渡すとTypeErrorが発生したり、警告が表示されたりします。
非推奨となる値の渡し方
例えば、文字列や数値を直接count関数に渡すと、予期せぬ動作を招く可能性があります。
以前のPHPでは、count("string")は1を返していましたが、これは論理的に不自然であるため修正されました。
特に、データベースの結果が空でnullが返ってきた場合に、そのままcount(null)を実行すると致命的なエラーになる可能性があります。
<?php
// PHP 8.x 以降で null をカウントしようとした場合
try {
$value = null;
echo count($value);
} catch (TypeError $e) {
echo "エラー: " . $e->getMessage();
}
?>
is_countable関数による事前チェック
変数がカウント可能なものであるかどうかを安全に確認するために、is_countable関数を使用することが推奨されます。
この関数は、引数が配列であるか、あるいはCountableインターフェースを実装したオブジェクトである場合にtrueを返します。
<?php
$data = null;
if (is_countable($data)) {
echo "要素数: " . count($data);
} else {
echo "このデータはカウントできません。";
}
?>
このように、事前に型をチェックする習慣をつけることで、実行時エラーを未然に防ぐことができます。
実践的な活用シーンとテクニック
配列の要素数を取得する知識を、実際のプログラムでどのように活用するか具体例を見ていきましょう。
ここでは、条件分岐やループ処理での応用について解説します。
配列が空かどうかの判定
「配列にデータが入っている場合のみ処理を行う」というロジックは頻出します。
count($array) > 0という条件式でも判定可能ですが、よりシンプルに記述する方法もあります。
<?php
$items = [];
// countを使用する場合
if (count($items) === 0) {
echo "アイテムがありません。";
}
// emptyを使用する場合(推奨)
if (empty($items)) {
echo "配列は空です。";
}
?>
単に空かどうかを知りたいだけであれば、empty関数を使用するほうが読みやすく、かつ高速です。
forループでのパフォーマンス最適化
for文を使って配列を回す際、終了条件にcount関数を直接記述することがあります。
しかし、ループのたびに要素数を計算するのは、配列が巨大な場合にパフォーマンス低下を招く恐れがあります。
<?php
$data = range(1, 10000);
// あまり良くない例(毎回 count が呼び出される)
for ($i = 0; $i < count($data); $i++) {
// 処理
}
// 良い例(一度だけ計算して変数に代入)
$total = count($data);
for ($i = 0; $i < $total; $i++) {
// 処理
}
?>
最近のPHPは非常に高速ですが、大規模なデータを扱うシステムでは、このような細かい最適化が全体のパフォーマンスに寄与します。
count関数の引数モード比較表
第2引数に指定できる定数とその効果を以下の表にまとめました。
| 定数名 | 値 | 動作内容 |
|---|---|---|
| COUNT_NORMAL | 0 | 最上位階層の要素のみをカウント(デフォルト)。 |
| COUNT_RECURSIVE | 1 | 多次元配列を再帰的にすべてカウント。 |
通常はCOUNT_NORMALを使用しますが、ツリー構造の全ノードを数えたい場合などにCOUNT_RECURSIVEを活用します。
Countableインターフェースの活用
PHPでは、自作のクラス(オブジェクト)に対してもcount関数を使えるようにすることができます。
そのためには、標準インターフェースであるCountableを実装します。
このインターフェースを実装し、count()メソッドを定義することで、そのクラスのインスタンスをcount関数に渡した際の挙動をカスタマイズできます。
<?php
class MyCollection implements Countable {
private array $items = [];
public function add($item) {
$this->items[] = $item;
}
public function count(): int {
return count($this->items);
}
}
$collection = new MyCollection();
$collection->add("Data 1");
$collection->add("Data 2");
echo "コレクションの要素数: " . count($collection);
?>
オブジェクトを配列のように扱いたいデザインパターンの場合、この方法は非常に有効です。
まとめ
PHPのcount関数は、配列の要素数を取得するためのシンプルながら強力なツールです。
基本的にはcount($array)だけで十分ですが、多次元配列を扱う際の再帰モードや、PHP 8以降の型厳格化への対応など、知っておくべきポイントがいくつかあります。
特に、nullやスカラー値を渡すとエラーになる可能性があるため、is_countableやis_arrayによる型チェックを併用するのがベストプラクティスです。
また、単なる空判定にはempty、ループの終了条件には事前の変数代入など、状況に応じた使い分けを意識してください。
これらの知識を適切に使い分けることで、より堅牢でパフォーマンスの高いPHPプログラムを構築できるはずです。
