獲取數組元素個數是 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_NORMAL | 0 | 默認,**不遞歸**進入子數組,僅統計頂層元素個數 |
COUNT_RECURSIVE | 1 | **遞歸統計**所有子數組元素總和(含嵌套層級) |
$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;
// 推薦:空數組為 false,非空為 true(利用類型轉換)
if ($news) { ... }
// 顯式:排除 null/非數組
if (is_array($news) && count($news, COUNT_NORMAL) > 0) { ... }
foreach ($news as $row) {
// 處理每行
}
$total = count($news); // 直接用 COUNT_NORMAL
$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 為總元素數,**大數組慎用**,可能導致棧溢出或執行超時。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())
null 返回 0,但會拋出 Warning(PHP 7.2+),務必先 is_array() 或 isset() 判斷。count() 與 strlen():字符串長度用 strlen() / mb_strlen(),count('abc') === 1。count($arr)**(等同 COUNT_NORMAL)統計頂層元素個數,語義清晰、性能最優。count($arr),勿用 COUNT_RECURSIVE。is_array($var) && count($var) > 0 判斷,避免 Warning 與邏輯漏洞。