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

PHP 統計字符串中字符出現次數並排序的三種方法對比

     編輯:PHP 綜合知識

需求描述

給定任意長度字符串,統計每個字符出現的次數,並按次數降序排列。本文對比三種實現思路,分析優劣。

方法一:內置函數鏈(最簡潔)

<?php
function countStr($str) {
    $arr = str_split($str);           // 字符串轉數組
    $arr = array_count_values($arr);  // 統計值出現次數
    arsort($arr);                     // 降序排序保持鍵值關聯
    return $arr;
}

$str = "asdfgfdas323344##\$\$fdsdfg*\$\*\$\*\$\*\$\$\$\$443563536254fas";
print_r(countStr($str));
?>

核心函數:str_split、array_count_values、arsort。
優點:代碼極少,可讀性高,執行效率高(C 底層實現)。
缺點:對多字節字符(中文)支持需用 mb_str_split (PHP 7.4+) 或 preg_split('//u')。

方法二:手動遍歷累加(經典算法)

<?php
function countStr2($str) {
    $arr = str_split($str);
    $result = [];
    foreach ($arr as $char) {
        if (!isset($result[$char])) {
            $result[$char] = 1;
        } else {
            $result[$char]++;
        }
    }
    arsort($result);
    return $result;
}

$str = "asdfgfdas323344##\$\$fdsdfg*\$\*\$\*\$\*\$\$\$\$443563536254fas";
var_dump(countStr2($str));
?>

優點:邏輯清晰,易於擴展(如同時統計大小寫不敏感)、移植到其他語言。
缺點:PHP 循環比內置函數慢。

方法三:去重後逐個計數(效率最低)

<?php
function countStr3($str) {
    $arr = str_split($str);
    $unique = array_unique($arr); // 獲取不重複字符
    $result = [];
    foreach ($unique as $char) {
        $result[$char] = substr_count($str, $char); // 遍歷字符串計數
    }
    arsort($result);
    return $result;
}

$str = "asdfgfdas323344##\$\$fdsdfg*\$\*\$\*\$\*\$\$\$\$443563536254fas";
var_dump(countStr3($str));
?>

缺點:array_unique + substr_count 導致多次遍歷字符串,時間複雜度 O(n²),大字符串極慢,不推薦生產使用。

性能對比(百萬字符級測試參考)

方法執行時間(相對)內存峰值推薦指數
方法一 (內置函數)1x (基準)低⭐⭐⭐⭐⭐
方法二 (手動遍歷)~3-5x中⭐⭐⭐
方法三 (去重計數)~50x+高⭐

中文/多字節字符處理

<?php
// PHP 7.4+ 使用 mb_str_split
$arr = mb_str_split($str, 1, 'UTF-8');

// 兼容舊版本
$arr = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
// 後續邏輯相同
?>

總結

首選方法一,利用 PHP 豐富的數組函數實現最優性能與可讀性。方法二適合教學或需自定義邏輯場景。方法三僅作為反面教材理解算法複雜度差異。

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