php按拼音首字母去重需分两步:先提取姓名汉字拼音首字母,再依首字母保留首个元素;推荐用overtrue/pinyin库,无composer时可用静态汉字映射表实现。

PHP 本身不内置拼音处理能力,按拼音首字母去重不是标准数组去重,而是分两步:
- 先提取每个子数组中指定字段(如
'name')的汉字拼音首字母; - 再基于该首字母做去重逻辑(保留首个出现的、或按规则选一个)。
这在 PHP 8.2 中完全可行,但需借助第三方库或自建映射表。下面给出实用、稳定、无需扩展的实现方案。
用 pinyin 库生成首字母(推荐)
最可靠的方式是使用轻量拼音库,例如 [`overtrue/pinyin`](https://github.com/overtrue/pinyin)(支持 PHP 8.2,无依赖):composer require overtrue/pinyin
然后这样写:
use Overtrue\Pinyin\Pinyin;
$pinyin = new Pinyin();
$users = [
['name' => '张三', 'age' => 25],
['name' => '李四', 'age' => 30],
['name' => '赵六', 'age' => 28],
['name' => '周七', 'age' => 32],
['name' => '张伟', 'age' => 26], // 和“张三”同首字母
];
$seen = [];
$result = [];
foreach ($users as $user) {
$firstChar = $pinyin->abbr($user['name'], true); // true 表示只取首字母,大写
$letter = strtoupper((string)$firstChar[0] ?? '');
if (!isset($seen[$letter])) {
$seen[$letter] = true;
$result[] = $user;
}
}
print_r($result);
// 输出:张三、李四、赵六、周七(各首字母 Z/L/Z/Z → 实际去重后保留第一个 Z)
注意:$pinyin->abbr() 返回数组,如 ['Z', 'H', 'A', 'N', 'G'],所以取 [0] 即首字母。
不用 Composer?用静态映射表快速替代
如果无法装包,可用精简版汉字→首字母映射(覆盖常用字):- 建一个
$map = ['张' => 'Z', '李' => 'L', '王' => 'W', '刘' => 'L', '陈' => 'C', ...]; - 遍历名字字符串,找到第一个匹配的汉字,返回对应字母;
- 非汉字字符(英文、数字、符号)可统一归为
#或跳过。
示例片段:
$map = [
'阿' => 'A', '八' => 'B', '插' => 'C', '发' => 'F', '高' => 'G',
'华' => 'H', '机' => 'J', '开' => 'K', '拉' => 'L', '马' => 'M',
'拿' => 'N', '哦' => 'O', '怕' => 'P', '七' => 'Q', '然' => 'R',
'他' => 'T', '哇' => 'W', '西' => 'X', '压' => 'Y', '炸' => 'Z',
// ……实际建议用完整 2000+ 字映射表(网上可搜“汉字拼音首字母表”)
];
function getFirstLetter($str, $map) {
for ($i = 0; $i abbr()
按首字母去重 ≠ 按内容去重,别混淆
需要明确: - 这不是去除「内容相同」的子数组(如两个 `['name'=>'张三','age'=>25]`); - 而是把「姓名首字母相同」的多个子数组,只留第一个(或其他策略); - 如果你本意是「先按拼音排序,再按内容去重」,那应先 `usort` + `array_unique(..., SORT_REGULAR)`,和首字母无关。关键点就三个:选好拼音来源(库 or 映射表)、准确提取首字母、用键存在性控制去重逻辑。PHP 8.2 完全支持,没兼容性问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











