PHP Conference Japan 2024

count

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

count計算陣列或 Countable 物件中的所有元素

說明

count(Countable|陣列 $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 參數的計數類型無效,count() 將會拋出 TypeError
7.2.0 現在,如果傳遞給 value 參數的計數類型無效,count() 將會產生警告。

範例

範例 #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 count() 非 Countable|array 範例(不良範例 - 不要這樣做)

<?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'));

// 遞迴計數
var_dump(count($food, COUNT_RECURSIVE));

// 一般計數
var_dump(count($food));

?>

以上範例將輸出:

int(8)
int(2)

範例 #4 可計數 物件

<?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)

另請參閱

新增註解

使用者貢獻的註解 6 則註解

onlyranga at gmail dot com
10 年前
[編者註:來自 from dot pl 的 array 指出 count() 是一個低成本的操作;然而,仍然存在函式呼叫的額外開銷。]

如果您要遍歷大型陣列,請勿在迴圈中使用 count() 函式,這會造成效能負擔,請將 count() 的值複製到一個變數中,並在迴圈中使用該值以獲得更好的效能。

例如:

// 不佳的做法

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

// 良好的做法

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
// 計算
}
lucasfsmartins at gmail dot com
5 年前
如果您使用的是 PHP 7.2+,則需要注意「版本變更記錄」,並使用如下程式碼:

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

您可以組織您的程式碼以確保變數是一個陣列,或者您可以繼承 Countable 介面,這樣您就不必進行此檢查。
danny at dannymendel dot com
17 年前
當您不想要陣列樹的所有層級時,我發現以下函式在處理多維陣列時更有用。

// $limit 設定為遞迴的次數
<?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;
}
?>
匿名
5 年前
對於不可數的物件

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

警告:count(): 參數必須是陣列或實作 Countable 的物件,位於 example.php 的第 159 行

#快速解決方法是將不可數的物件強制轉換為陣列。

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

計數:250
pied-pierre
9 年前
一個單行函式,用於遞迴查找非陣列元素的數量

function count_elt($array, &$count=0){
foreach($array as $v) if(is_array($v)) count_elt($v,$count); else ++$count;
return $count;
}
alexandr at vladykin dot pp dot ru
18 年前
我的函式會根據陣列的深度傳回多維陣列中元素的數量。(幾乎等同於 COUNT_RECURSIVE,但您可以指定要探測的深度)。

<?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;
}
?>
To Top