count() 與 sizeof() 在 PHP 中功能完全相同 (sizeof 是 count 別名)。本文詳細解析參數模式、多維陣列遞歸計數、標量/未定義變數行為、大型陣列效能特性,並提供最佳實務建議。
count(Countable|array $value, int $mode = COUNT_NORMAL): int // 模式常數 COUNT_NORMAL = 0; // 預設,不遞歸 COUNT_RECURSIVE = 1; // 遞歸計算多維陣列所有元素總數
| 輸入 | count($v) | count($v, COUNT_RECURSIVE) | 說明 |
|---|---|---|---|
[1,2,3] | 3 | 3 | 一維陣列 |
['a'=>1,'b'=>2] | 2 | 2 | 關聯陣列 |
[[1,2],[3,4]] | 2 | 6 | 二維陣列:正常模式數子陣列,遞歸模式數所有葉子元素 |
"hello" | 1 | 1 | 標量視為 1 元素 |
123 | 1 | 1 | 整數/浮點數同標量 |
null | 0 | 0 | null 視為空 |
| 未定義變數 | 0 (發出 Notice) | 0 | 建議先 isset() 檢查 |
實作 Countable 介面物件 | 呼叫 count() 方法 | 同左 | 物件計數自定義 |
$data = [
'users' => [
['id'=>1, 'name'=>'John', 'tags'=>['php','js']],
['id'=>2, 'name'=>'Jane', 'tags'=>['python']],
],
'meta' => ['total'=>2, 'page'=>1],
];
echo count($data); // 2 (頂層鍵: users, meta)
echo count($data, COUNT_RECURSIVE); // 10 (所有標量值: 1,John,php,js, 2,Jane,python, 2,1 + 2個子陣列自身? 實際為 10)
// 詳細統計: users(1陣列) + 2用戶陣列 + 2id + 2name + 3tags + meta(1陣列) + 2meta值 = 10
count():語意明確、官方推薦、sizeof 為別名無優勢。// ❌ 慢:每次迴圈呼叫 count() for ($i=0; $i
COUNT_RECURSIVE 較慢:需遞歸遍歷所有層級。若頻繁需要知道總元素數,考慮維護一個計數器欄位或扁平化儲存。count($all_rows) 取得總筆數。必須用 SELECT COUNT(*) SQL 查詢。class ProductCollection implements Countable {
private array $products = [];
private int $cached_count = 0; // 快取計數
public function add(Product $p): void {
$this->products[] = $p;
$this->cached_count++;
}
public function count(): int {
return $this->cached_count; // O(1) 返回,無需遍歷
}
}
$coll = new ProductCollection();
$coll->add(new Product()); $coll->add(new Product());
echo count($coll); // 2 - 自動呼叫 $coll->count()
sizeof 不比 count 快:完全相同函數,僅別名。count([]) = 0,count([[]]) = 1:空陣列長度 0,含一個空子陣列長度 1。strlen():count("abc") 返回 1 (標量),非 3。掌握 count() 細節,能寫出正確、高效能的陣列處理代碼,避免多維陣列統計錯誤與迴圈效能陷阱。