使用关联数组统计PHP字符串中各字符频次:先遍历字符串累加计数,再用array_filter筛选出现次数大于1的字符。

要统计 PHP 字符串中每个字符的出现频率,核心是遍历字符串、逐个记录字符计数。最常用且高效的方法是使用关联数组(即哈希表)作为计数器。
基础方法:foreach + 字符遍历
将字符串转为字符数组,用 foreach 遍历并累加计数:
$str = "hello world";
$count = [];
for ($i = 0; $i < strlen($str); $i++) {
$char = $str[$i];
if (!isset($count[$char])) {
$count[$char] = 1;
} else {
$count[$char]++;
}
}
// 或更简洁写法:
// $count[$char] = ($count[$char] ?? 0) + 1;
该方式直观、兼容所有 PHP 版本,适合理解原理。注意:中文等多字节字符需用 mb_* 函数处理,否则可能乱码或截断。
推荐方法:array_count_values + str_split
利用内置函数组合,代码更简洁、性能更好:
立即学习“PHP免费学习笔记(深入)”;
$str = "hello world"; $chars = str_split($str); // 拆成单字符数组(仅适用于 ASCII) $count = array_count_values($chars);
- 优点:一行核心逻辑,底层 C 实现,速度快;自动忽略键不存在检查。
-
注意点:默认不支持 UTF-8 多字节字符;如需中文支持,改用
mb_str_split($str, 1)(PHP 7.4+)或手动循环 +mb_substr。
中文/Unicode 字符安全统计
处理中文、emoji 等时,必须按“字符”而非“字节”切分:
$str = "你好?world";
$count = [];
$len = mb_strlen($str, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($str, $i, 1, 'UTF-8');
$count[$char] = ($count[$char] ?? 0) + 1;
}
关键在于始终指定编码(如 'UTF-8'),避免 strlen/substr 对中文返回错误长度或乱码。
进阶:按频率排序或取高频字符
统计完后常需排序或筛选,可用以下函数:
-
arsort($count):按值降序排列,保留键名(最常用) -
array_slice($count, 0, 5):取前 5 个最高频字符 -
array_keys(array_filter($count, fn($v) => $v > 1)):找出出现超过 1 次的字符










