PHPのお勉強!

PHP TOP

count

(PHP 4, PHP 5, PHP 7, PHP 8)

count配列または Countable オブジェクトに含まれるすべての要素の数を数える

説明

count(Countable|array $value, int $mode = COUNT_NORMAL): int

配列の場合は、配列の全ての要素を数えます。 Countable インターフェイスを実装したオブジェクトの場合は、 Countable::count() の戻り値を返します。

パラメータ

value

配列あるいは Countable オブジェクト。

mode

オプションのmode 引数が COUNT_RECURSIVE (または 1) にセットされた場合、count() は再帰的に配列をカウントします。 これは多次元配列の全ての要素をカウントするといった場合に特に有効です。

警告

count() は、再帰を検出して無限ループを回避するようになっています。 しかしその場合 (配列の中に自分自身が複数回登場する場合) は毎回 E_WARNING を発行し、期待する結果より大きい数を返します。

戻り値

value の要素の数を返します。 PHP 8.0.0 より前のバージョンでは、 パラメータが配列でもなく Countable インターフェイスを 実装したオブジェクトでもない場合、1 が返されていました。 ただし、valuenull の場合、 0 が返されていました。

変更履歴

バージョン 説明
8.0.0 value パラメータに不正な型を渡した場合に、 TypeError をスローするようになりました。
7.2.0 value パラメータに不正な型を渡した場合に、 警告を発生させるようになりました。

例1 count() の例

<?php
$a
[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
var_dump(count($b));
?>

上の例の出力は以下となります。

int(3)
int(3)

例2 Countable|array でない値を渡した場合の count() の例 (悪い例です - 真似しないでね!)

<?php
$b
[0] = 7;
$b[5] = 9;
$b[10] = 11;
var_dump(count($b));

var_dump(count(null));

var_dump(count(false));
?>

上の例の出力は以下となります。

int(3)
int(0)
int(1)

上の例の PHP 7.2 での出力は、このようになります。

int(3)

Warning: count(): Parameter must be an array or an object that implements Countable in … on line 12
int(0)

Warning: count(): Parameter must be an array or an object that implements Countable in … on line 14
int(1)

上の例の PHP 8 での出力は、このようになります。:

int(3)

Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable .. on line 12

例3 再帰的な count() の例

<?php
$food
= array('fruits' => array('orange', 'banana', 'apple'),
'veggie' => array('carrot', 'collard', 'pea'));

// recursive count
var_dump(count($food, COUNT_RECURSIVE));

// normal count
var_dump(count($food));

?>

上の例の出力は以下となります。

int(8)
int(2)

例4 Countable オブジェクトの例

<?php
class CountOfMethods implements Countable
{
private function
someMethod()
{
}

public function
count(): int
{
return
count(get_class_methods($this));
}
}

$obj = new CountOfMethods();
var_dump(count($obj));
?>

上の例の出力は以下となります。

int(2)

参考

  • is_array() - 変数が配列かどうかを検査する
  • isset() - 変数が宣言されていること、そして null とは異なることを検査する
  • empty() - 変数が空であるかどうかを検査する
  • strlen() - 文字列の長さを得る
  • is_countable() - 引数が、数えられる値かどうかを調べる
  • Arrays

add a note

User Contributed Notes 6 notes

up
143
onlyranga at gmail dot com
10 years ago
[Editor's note: array at from dot pl had pointed out that count() is a cheap operation; however, there's still the function call overhead.]

If you want to run through large arrays don't use count() function in the loops , its a over head in performance, copy the count() value into a variable and use that value in loops for a better performance.

Eg:

// Bad approach

for($i=0;$i<count($some_arr);$i++)
{
// calculations
}

// Good approach

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
// calculations
}
up
3
lucasfsmartins at gmail dot com
5 years ago
If you are on PHP 7.2+, you need to be aware of "Changelog" and use something like this:

<?php
$countFruits
= is_array($countFruits) || $countFruits instanceof Countable ? count($countFruits) : 0;
?>

You can organize your code to ensure that the variable is an array, or you can extend the Countable so that you don't have to do this check.
up
13
danny at dannymendel dot com
17 years ago
I actually find the following function more useful when it comes to multidimension arrays when you do not want all levels of the array tree.

// $limit is set to the number of recursions
<?php
function count_recursive ($array, $limit) {
$count = 0;
foreach (
$array as $id => $_array) {
if (
is_array ($_array) && $limit > 0) {
$count += count_recursive ($_array, $limit - 1);
} else {
$count += 1;
}
}
return
$count;
}
?>
up
2
Anonymous
5 years ago
For a Non Countable Objects

$count = count($data);
print "Count: $count\n";

Warning: count(): Parameter must be an array or an object that implements Countable in example.php on line 159

#Quick fix is to just cast the non-countable object as an array..

$count = count((array) $data);
print "Count: $count\n";

Count: 250
up
3
pied-pierre
9 years ago
A function of one line to find the number of elements that are not arrays, recursively :

function count_elt($array, &$count=0){
foreach($array as $v) if(is_array($v)) count_elt($v,$count); else ++$count;
return $count;
}
up
7
alexandr at vladykin dot pp dot ru
18 years ago
My function returns the number of elements in array for multidimensional arrays subject to depth of array. (Almost COUNT_RECURSIVE, but you can point on which depth you want to plunge).

<?php
function getArrCount ($arr, $depth=1) {
if (!
is_array($arr) || !$depth) return 0;

$res=count($arr);

foreach (
$arr as $in_ar)
$res+=getArrCount($in_ar, $depth-1);

return
$res;
}
?>