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

PHP 獲取數組長度完全指南:count()、sizeof() 與多維數組遞歸統計

     編輯:PHP 相關知識

前言

獲取數組元素個數是 PHP 開發中最高頻的操作之一。PHP 提供了 count() 和 sizeof() 兩個函數,但它們在多維數組處理上存在關鍵差異。本文系統講解一維/多維數組長度統計、參數詳解、性能差異及常見陷阱。

基礎函數:count() vs sizeof()

$arr = ['a', 'b', 'c'];
echo count($arr);    // 3
echo sizeof($arr);   // 3 (sizeof 是 count 的別名)

// 空數組/未定義變量
echo count([]);           // 0
echo count($undefined);   // 0 (會觸發 Warning: Undefined variable)
echo count(null);         // 0
echo count(123);          // 1 (標量視為 1 個元素)
echo count('abc');        // 1 (字符串視為 1 個元素)

結論:sizeof() === count(),官方推薦使用 count(),語義更清晰。

關鍵參數:mode (PHP 4.2+)

count(Countable|array $value, int $mode = COUNT_NORMAL): int
常量值行為
COUNT_NORMAL0默認,**不遞歸**進入子數組,僅統計頂層元素個數
COUNT_RECURSIVE1**遞歸統計**所有子數組元素總和(含嵌套層級)

多維數組實戰演示

$news = [
    0 => ['title' => '新聞1', 'view' => 123, 'content' => '...'],
    1 => ['title' => '新聞2', 'view' => 99,  'content' => '...'],
];

// 1. 統計新聞條數(頂層元素):期望 2
echo 'COUNT_NORMAL: ' . count($news, COUNT_NORMAL); // 2 ✓

// 2. 遞歸統計所有標量值:2 (頂層) + 3*2 (每條3字段) = 8
echo 'COUNT_RECURSIVE: ' . count($news, COUNT_RECURSIVE); // 8

// 3. 僅統計二維數組的行數(最常見需求)
$rowCount = count($news); // 等同 COUNT_NORMAL
// 或顯式語義化
$rowCount = is_array($news) ? count($news, COUNT_NORMAL) : 0;

常見業務場景與正確寫法

1. 判斷數組是否為空(有數據)

// 推薦:空數組為 false,非空為 true(利用類型轉換)
if ($news) { ... }

// 顯式:排除 null/非數組
if (is_array($news) && count($news, COUNT_NORMAL) > 0) { ... }

2. 遍歷二維數組獲取行數

foreach ($news as $row) {
    // 處理每行
}
$total = count($news); // 直接用 COUNT_NORMAL

3. 統計多維數組所有葉子節點數

$data = [
    'users' => [
        ['name' => 'A', 'tags' => ['php', 'go']],
        ['name' => 'B', 'tags' => ['java']],
    ],
    'meta' => ['version' => 1, 'tags' => ['api']]
];

// 遞歸統計所有標量值
echo count($data, COUNT_RECURSIVE); // 9 (含鍵名? 不含,只含值)
// 實際輸出:users(2) + meta(2) + 內部標量值 = 需實測
// 建議:自定義遞歸函數精確控制統計邏輯

性能與內存考量

  • COUNT_NORMAL:O(1) 級別,極快,僅讀取數組結構體中的元素計數器。
  • COUNT_RECURSIVE:需遞歸遍歷所有子數組,時間復雜度 O(N),N 為總元素數,**大數組慎用**,可能導致棧溢出或執行超時。
  • PHP 7.2+ 對大數組 count() 有優化,但遞歸模式本質未變。

進階:實現 Countable 接口自定義計數邏輯

class PaginatedCollection implements Countable {
    private $items = [];
    private $total = 0; // 數據庫總條數
    
    public function __construct(array $items, int $total) {
        $this->items = $items;
        $this->total = $total;
    }
    
    public function count(): int {
        return $this->total; // 返回總條數而非當前頁數量
    }
    
    public function getItems(): array {
        return $this->items;
    }
}

$collection = new PaginatedCollection([1,2,3], 100);
echo count($collection); // 100 (觸發 Countable::count())

避坑清單

  1. 誤用 COUNT_RECURSIVE 導致邏輯錯誤:以為統計行數,實際統計了所有字段值。
  2. 對非數組調用 count():標量返回 1,null 返回 0,但會拋出 Warning(PHP 7.2+),務必先 is_array() 或 isset() 判斷。
  3. 遞歸統計超大數組導致內存/棧溢出:改用迭代器或分批處理。
  4. 混淆 count() 與 strlen():字符串長度用 strlen() / mb_strlen(),count('abc') === 1。

總結

  • **首選 count($arr)**(等同 COUNT_NORMAL)統計頂層元素個數,語義清晰、性能最優。
  • **多維數組行數統計**:直接用 count($arr),勿用 COUNT_RECURSIVE。
  • **需要遞歸統計**時,明確業務含義(統計所有葉子值?統計所有子數組個數?),必要時自定義遞歸函數。
  • **嚴謹代碼**總是先 is_array($var) && count($var) > 0 判斷,避免 Warning 與邏輯漏洞。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved