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
クラスにsetQuantity
・count
メソッドを実装しました。
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
インターフェースを実装することで、オブジェクトでカウントしたい値を返すことも可能でした。
コメント