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;
?>