首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 陣列長度統計:count() 與 sizeof() 差異、多維陣列遞歸計數與效能考量

     編輯:PHP 綜合知識

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]33一維陣列
['a'=>1,'b'=>2]22關聯陣列
[[1,2],[3,4]]26二維陣列:正常模式數子陣列,遞歸模式數所有葉子元素
"hello"11標量視為 1 元素
12311整數/浮點數同標量
null00null 視為空
未定義變數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 查詢。

進階:實作 Countable 介面自定義計數

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() 細節,能寫出正確、高效能的陣列處理代碼,避免多維陣列統計錯誤與迴圈效能陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved