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

PHP 陣列統計函數完全指南:count() 與 array_count_values() 實戰應用

     編輯:PHP 相關知識

PHP 提供豐富的陣列統計函數,其中 count()(及別名 sizeof())與 array_count_values() 是最常用的兩項。本文詳細解析其用法、差異、效能特性與實戰應用場景。

count() / sizeof():取得陣列元素總數

基本語法

count(Countable|array $value, int $mode = COUNT_NORMAL): int
  • $value:目標陣列或實作 Countable 介面的物件
  • $mode:COUNT_NORMAL(預設,不遞迴)或 COUNT_RECURSIVE(遞迴計算多維陣列)

基本用法範例

<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
echo count($arr);        // 輸出: 5
echo sizeof($arr);       // 輸出: 5 (別名函數)

// 多維陣列
$multi = [
    'fruits' => ['apple', 'banana'],
    'colors' => ['red', 'blue', 'green']
];
echo count($multi);              // 輸出: 2 (第一層鍵數)
echo count($multi, COUNT_RECURSIVE); // 輸出: 7 (2 + 2 + 3)
?>

特殊情況處理

輸入結果說明
空陣列 []0正常回傳
未定義變數0 + 警告PHP 7.2+ 拋出 Warning
null0 + 警告建議先 is_array() 檢查
純量值 (字串/數字)1 + 警告非 Countable 物件

安全使用模式

function safeCount($var) {
    return is_countable($var) ? count($var) : 0;
    // PHP 7.3+ 可用 is_countable()
    // 舊版用: is_array($var) || $var instanceof Countable
}

array_count_values():統計各值出現次數

基本語法

array_count_values(array $array): array

回傳關聯陣列:鍵 => 原始值, 值 => 出現次數

實戰範例

<?php
$array = [4, 5, 1, 2, 3, 1, 2, 1];
$ac = array_count_values($array);

print_r($ac);
/* 輸出:
Array
(
    [4] => 1
    [5] => 1
    [1] => 3
    [2] => 2
    [3] => 1
)
*/
?>

字串陣列統計

$fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
$stats = array_count_values($fruits);
/*
Array
(
    [apple] => 3
    [banana] => 2
    [orange] => 1
)
*/

進階應用場景

1. 找出陣列中出現最多的值(眾數)

function findMode($array) {
    if (empty($array)) return null;
    $counts = array_count_values($array);
    arsort($counts); // 依值降序排序,保持鍵關聯
    return key($counts); // 回傳第一個鍵(出現最多次的值)
}

$data = [1, 2, 2, 3, 3, 3, 4];
echo findMode($data); // 輸出: 3

2. 檢測重複值

function hasDuplicates($array) {
    $counts = array_count_values($array);
    return max($counts) > 1;
}

function getDuplicates($array) {
    $counts = array_count_values($array);
    return array_filter($counts, fn($count) => $count > 1);
}

$test = ['a', 'b', 'c', 'a'];
var_dump(hasDuplicates($test)); // true
print_r(getDuplicates($test));  // ['a' => 2]

3. 資料分布分析

$scores = [85, 92, 78, 92, 85, 85, 90, 78, 95, 85];
$distribution = array_count_values($scores);
arsort($distribution);

foreach ($distribution as $score => $count) {
    $bar = str_repeat('█', $count);
    echo "{$score} 分: {$count} 人 {$bar}\n";
}
/* 輸出範例:
85 分: 4 人 ████
92 分: 2 人 ██
78 分: 2 人 ██
90 分: 1 人 █
95 分: 1 人 █
*/

效能比較與最佳實踐

count() vs sizeof()

  • 完全相同:sizeof 是 count 別名
  • 建議使用 count():語義更清晰,社群慣用
  • O(1) 複雜度:PHP 陣列內部維護元素計數,無需遍歷

array_count_values() 效能特性

  • 時間複雜度 O(n):需遍歷整個陣列
  • 記憶體開銷:建立新關聯陣列,大陣列需注意
  • 僅支援純量值:陣列/物件值會拋出 Warning

大量資料優化策略

// 1. 分批處理大陣列
function chunkedCountValues($array, $chunkSize = 10000) {
    $result = [];
    foreach (array_chunk($array, $chunkSize) as $chunk) {
        $partial = array_count_values($chunk);
        foreach ($partial as $key => $count) {
            $result[$key] = ($result[$key] ?? 0) + $count;
        }
    }
    return $result;
}

// 2. 使用 Generator 避免記憶體峰值
function* countValuesGenerator($array) {
    $counts = [];
    foreach ($array as $value) {
        $counts[$value] = ($counts[$value] ?? 0) + 1;
        yield $value => $counts[$value]; // 即時產出
    }
}

常見錯誤與避坑

錯誤原因修正
count(null) 不檢查PHP 7.2+ 拋出 Warning先用 is_countable() 或 is_array()
array_count_values() 處理多維陣列Warning: 值必須是純量先扁平化 array_merge(...$multi) 或遞迴處理
混淆 count($arr, COUNT_RECURSIVE) 意義計算所有層級元素總數,非子陣列個數理解遞迴模式統計邏輯
對關聯陣列用 count() 判斷「是否為空」邏輯正確但語義不清建議用 empty($arr) 或 $arr === []

總結

count() 與 array_count_values() 是 PHP 陣列統計的雙核心工具:

  • count():O(1) 取得總元素數,支援遞迴模式
  • array_count_values():O(n) 產生值頻率分布表

熟練掌握兩者配合使用(如先 count() 快速判斷空陣列,再 array_count_values() 深度分析),能高效解決資料統計、重複檢測、分布分析等常見需求。注意邊界條件處理與大資料量優化,是寫出健壯程式碼的關鍵。

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