PHP count() 陣列長度
count() 函數用來計算陣列中的元素數量。
基本用法
<?php
$arr = [1, 2, 3, 4, 5];
echo count($arr); // 5
?>
語法
count(Countable|array $value, int $mode = COUNT_NORMAL): int
$value:陣列或實作 Countable 介面的物件$mode:計數模式(COUNT_NORMAL 或 COUNT_RECURSIVE)- 回傳值:元素數量
sizeof() 別名
sizeof() 是 count() 的別名:
<?php
$arr = [1, 2, 3];
echo count($arr); // 3
echo sizeof($arr); // 3
?>
空陣列
<?php
$empty = [];
echo count($empty); // 0
if (count($arr) === 0) {
echo "陣列是空的";
}
// 更簡潔的方式
if (empty($arr)) {
echo "陣列是空的";
}
?>
關聯陣列
<?php
$person = [
'name' => 'Alice',
'age' => 25,
'city' => 'Taipei'
];
echo count($person); // 3
?>
多維陣列
COUNT_NORMAL(預設)
只計算第一層元素:
<?php
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
echo count($matrix); // 3(三個子陣列)
?>
COUNT_RECURSIVE
遞迴計算所有元素:
<?php
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
echo count($matrix, COUNT_RECURSIVE); // 12(3 個子陣列 + 9 個數字)
// 計算實際元素數量
$totalElements = count($matrix, COUNT_RECURSIVE) - count($matrix);
echo $totalElements; // 9
?>
複雜巢狀結構
<?php
$data = [
'users' => [
['name' => 'Alice', 'age' => 25],
['name' => 'Bob', 'age' => 30],
],
'settings' => [
'theme' => 'dark',
'language' => 'zh-TW'
]
];
echo count($data); // 2
echo count($data, COUNT_RECURSIVE); // 12
?>
常見應用
迴圈控制
<?php
$arr = ['a', 'b', 'c'];
// 不好:每次迭代都呼叫 count
for ($i = 0; $i < count($arr); $i++) {
echo $arr[$i];
}
// 好:預先儲存長度
$length = count($arr);
for ($i = 0; $i < $length; $i++) {
echo $arr[$i];
}
// 更好:使用 foreach
foreach ($arr as $item) {
echo $item;
}
?>
驗證資料
<?php
function validateItems(array $items, int $minCount = 1): bool {
if (count($items) < $minCount) {
echo "至少需要 $minCount 個項目\n";
return false;
}
return true;
}
validateItems([]); // false:至少需要 1 個項目
validateItems(['a', 'b']); // true
?>
檢查陣列是否有元素
<?php
$arr = [1, 2, 3];
// 使用 count
if (count($arr) > 0) {
echo "陣列有元素";
}
// 更簡潔
if ($arr) {
echo "陣列有元素";
}
// 檢查空陣列
if (!$arr) {
echo "陣列是空的";
}
if (empty($arr)) {
echo "陣列是空的";
}
?>
分頁計算
<?php
function calculatePages(array $items, int $perPage): int {
return (int) ceil(count($items) / $perPage);
}
$items = range(1, 95);
echo calculatePages($items, 10); // 10(95/10 = 9.5,無條件進位)
?>
陣列比較
<?php
$arr1 = [1, 2, 3];
$arr2 = [1, 2, 3, 4, 5];
if (count($arr1) === count($arr2)) {
echo "兩個陣列長度相同";
} else {
echo "陣列長度不同";
}
?>
計算特定元素數量
array_count_values()
計算每個值出現的次數:
<?php
$arr = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
$counts = array_count_values($arr);
print_r($counts);
// ['apple' => 3, 'banana' => 2, 'orange' => 1]
?>
搭配 array_filter()
計算符合條件的元素:
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 計算偶數數量
$evenCount = count(array_filter($numbers, fn($n) => $n % 2 === 0));
echo $evenCount; // 5
// 計算大於 5 的數量
$greaterCount = count(array_filter($numbers, fn($n) => $n > 5));
echo $greaterCount; // 5
?>
Countable 介面
自訂類別可以實作 Countable 介面:
<?php
class Collection implements Countable {
private array $items = [];
public function add($item): void {
$this->items[] = $item;
}
public function count(): int {
return count($this->items);
}
}
$collection = new Collection();
$collection->add('a');
$collection->add('b');
$collection->add('c');
echo count($collection); // 3
?>
注意事項
<?php
// count(null) 會產生警告(PHP 7.2+)
// echo count(null); // Warning
// 安全地使用
$value = null;
echo count($value ?? []); // 0
// 或先檢查
if (is_array($value)) {
echo count($value);
}
// 字串不能用 count
$str = "Hello";
// echo count($str); // Warning,回傳 1
echo strlen($str); // 5
?>
效能考量
count() 對於陣列是 O(1) 操作,因為 PHP 內部維護了陣列長度:
<?php
// 非常快速
$arr = range(1, 1000000);
$start = microtime(true);
$len = count($arr);
$time = microtime(true) - $start;
echo "Time: {$time}s\n"; // 幾乎瞬間完成
// COUNT_RECURSIVE 較慢(需要遍歷)
$nested = array_fill(0, 1000, range(1, 100));
$start = microtime(true);
$len = count($nested, COUNT_RECURSIVE);
$time = microtime(true) - $start;
?>