PHPで配列の要素数を取得するcount関数の使い方!

PHP

PHPのcount関数の使い方について書いています。
count関数の主な使い方は、配列の要素の数を数える場合に、よく使用します。

使い方の説明の後に、簡単なサンプルコードを3パターン書いているので確認してみてください。
コードは、PHPバージョン8で検証しています。

公式のcount関数のドキュメントはこちらです。

count関数の使い方は?

PHPのcount関数は、配列の要素の数を数えてくれます。
また、Countableオブジェクトを関数に渡した場合は、オブジェクトに実装しているcountメソッドの返り値を返します。

count関数には、第1引数にカウントしたい配列(またはオブジェクト)、第2引数にカウントするモードを渡します。

count([配列またはオブジェクト],[カウントモード]);

配列をカウントする

第2引数は省略可能で、配列をそのままカウントする場合は、下記のようになります。

<?php
$fruits = ['apple', 'grape', 'orange'];

echo count($fruits);

この配列には要素を3つ入れているので、出力結果は「3」になります。
第2引数を省略した場合は、デフォルトでCOUNT_NORMAL(0)が設定されます。

第2引数は何のためにあるのかと言うと、配列を再帰的にカウントするために用意されています。
例えば、下記のようにカウントしてみます。

<?php
$foods = [
    'fruits' => [
        'apple',
        'orange'
    ],
    'washoku' => [
        'sushi',
        'tempura',
        'sukiyaki'
    ],
];

echo count($foods);

カウントモードを設定せずに、カウントした場合は、配列の最初の階層のみがカウントされて結果は「2」になります。

ここでcount関数に下記のようにモードを設定し、出力します。

echo count($foods, COUNT_RECURSIVE);

COUNT_RECURSIVE(1)を設定すると、再帰的に配列をカウントしてくれます。
結果として、第1階層と第2階層をカウントするため、要素数は「7」になります。

Countableを実装したオブジェクトのカウント

Countableインターフェースを実装したオブジェクトの場合は、そのオブジェクトのcountメソッドの内容が返されます。
例えば、下記のようにCountableを実装したクラスを作成して、count関数に渡してみます。

<?php
class Fruits implements Countable
{
    private $quantity = 0;

    public function setQuantity($quantity) {
        $this->quantity = $quantity;
    }

    public function count(): int
    {
        return $this->quantity;
    }
}

$fruit = new Fruits();
$fruit->setQuantity(77);

echo count($fruit);

FruitsクラスにsetQuantitycountメソッドを実装しました。

setQuantityメソッドはオブジェクトに対して、渡した数量を$quantity変数に保持しておきます。
Countableインターフェースを実装したcountメソッドでは、保持した数量を返すようにしています。

クラスを定義した後に、実際に下記のように使用しています。
数量として「77」を設定した後に、PHPのcount関数に作成したオブジェクトを渡しました。

$fruit = new Fruits();
$fruit->setQuantity(77);

echo count($fruit);

こうすると、クラスに実装したcountメソッドが呼び出されて、結果として「77」が返されます。

Countableを実装していないオブジェクトをcountすると…

Countableインターフェースを実装していないクラスのオブジェクトの場合は、下記のようにエラーが出るため注意が必要です。

PHP Fatal error:  Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, Fruits given in xxx

count関数を使用したサンプルコード3パターン

count関数を使用したサンプルコードを3パターン書いてみました。

数値のみの配列をカウントする

数値のみを入れた配列をcount関数に渡してみます。

<?php
$numbers = [1, 20, 77, 100, 200];

echo count($numbers); // 5が出力される

配列の内容に関係なく、要素数のカウントなので、結果は「5」になります。

COUNT_NORMALとCOUNT_RECURSIVEを指定してみる

同じ配列に対して、第2引数のモードを指定して比べてみます。

<?php
$foods = [
    '麺類' => [
        'ラーメン',
        'そば',
        'うどん'
    ],
    '魚' => [
        '寿司',
        '焼魚',
        'お刺身',
    ],
];

echo count($foods, COUNT_NORMAL);
echo count($foods, COUNT_RECURSIVE);

デフォルトなので、COUNT_NORMALは指定しなくても良いですが、指定してみました。

COUNT_NORMALを指定して、echoしている箇所では、配列の第1階層の要素数がカウントされて「2」が出力されます。
COUNT_RECURSIVEを指定している方では、全ての要素がカウントされて「8」が出力されます。

for文にcountを使用して、要素を出力する

下記のように、for文を使用している箇所で使うことも可能です。

<?php
$foods = [
    'ラーメン',
    'うどん',
    '寿司'
];

for($i = 0; $i < count($foods); $i++) {
    echo $foods[$i];
}

変数$iがカウントアップに使用されていて、$foodsに入っている要素がひとつずつ取り出されます。
結果として、「ラーメン」「うどん」「寿司」と連続して出力されます。

今回はfor文で書いてみましたが、全ての要素数分ループする処理の場合は、基本的にはforeach文を使用した方が良いです。
条件やカウントアップする値を間違えてバグを作る可能性があるためです。

まとめ

今回はPHPのcount関数についての説明と簡単なサンプルコードを書いてみました。

基本的には、配列の要素数をカウントするときに使用するかと思います。
配列をカウントでは、第1階層の要素のみカウントされました。
配列の階層が深い場合は、COUNT_RECURSIVEを第2引数に指定する必要がありました。

また、記載したようにオブジェクトにCountableインターフェースを実装することで、オブジェクトでカウントしたい値を返すことも可能でした。

コメント

タイトルとURLをコピーしました