如何按首次出现顺序对字符串中的元音与辅音字符分别排序
技术百科
花韻仙語
发布时间:2026-01-25
浏览: 次 本文介绍在 php 中如何将字符串拆分为元音和辅音字符,统一转为小写并去除空格后,**按各字符在原字符串中首次出现的顺序进行分组排序**(即相同字符按频次重复,但整体保持“先出现的字符类型优先排列”),而非简单按字母表顺序排序。
要实现“按首次出现顺序排序”,关键在于:不改变字符类别的相对位置顺序,仅对同一类别内的重复字符做频次聚合,并保持该 
下面是一个清晰、健壮的实现方案:
function sortCharactersByFirstOccurrence($text) {
$text = strtolower(str_replace(' ', '', $text));
$vowels = ['a', 'e', 'i', 'o', 'u'];
// 提取所有元音和辅音(保留原始顺序)
$allVowels = [];
$allConsonants = [];
for ($i = 0; $i < strlen($text); $i++) {
$char = $text[$i];
if (in_array($char, $vowels)) {
$allVowels[] = $char;
} else {
$allConsonants[] = $char;
}
}
// 统计频次,并按首次出现顺序拼接
$vowelFreq = [];
$consonantFreq = [];
// 元音频次统计(保持首次出现顺序)
foreach ($allVowels as $v) {
if (!isset($vowelFreq[$v])) {
$vowelFreq[$v] = 1;
} else {
$vowelFreq[$v]++;
}
}
// 辅音同理
foreach ($allConsonants as $c) {
if (!isset($consonantFreq[$c])) {
$consonantFreq[$c] = 1;
} else {
$consonantFreq[$c]++;
}
}
// 按原始出现顺序去重得到字符序列(PHP 7.4+ 可用 array_keys(array_flip(...)),但此处手动保序更明确)
$orderedVowels = array_values(array_unique($allVowels));
$orderedConsonants = array_values(array_unique($allConsonants));
// 构建结果
$vowelResult = '';
foreach ($orderedVowels as $v) {
$vowelResult .= str_repeat($v, $vowelFreq[$v]);
}
$consonantResult = '';
foreach ($orderedConsonants as $c) {
$consonantResult .= str_repeat($c, $consonantFreq[$c]);
}
echo "Vowels : {$vowelResult}\n";
echo "Consonants : {$consonantResult}\n";
}
// 测试
sortCharactersByFirstOccurrence('Sample Case');输出:
Vowels : aaee Consonants : ssmplc
✅ 核心要点总结:
- 先清洗字符串(小写 + 去空格),再逐字符遍历,严格按原始位置分离元音/辅音;
- 使用 array_unique()(配合 array_values())提取首次出现顺序的不重复字符列表,确保拼接时顺序正确;
- 利用关联数组统计频次,再按保序后的字符键循环拼接,实现“同字符聚集 + 类别内首现优先”;
- 避免使用 sort() 或 ksort() —— 它们会破坏原始位置逻辑;
- 此方案兼容含重复字符、大小写混合、多空格等常见边界情况。
该方法语义清晰、易于维护,适用于文本分析、密码学预处理或教学演示等需要保留字符时序特征的场景。
# 是一个
# 出现在
# 适用于
# 首次
# 而非
# 关键在于
# 循环
# 字符串
# red
# 排列
# php
# 遍历
# sort
# 在前
# 关联数组
# 现时
# 按原
# ksort
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Golang中理解指针比较_Golang地址
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- Python正则表达式实战_模式匹配说明【教程】
- Win11怎么关闭触摸屏_禁用Win11笔记本触摸
- Python对象生命周期管理_创建销毁说明【指导】
- XAMPP 启动失败(Apache 突然停止)的终
- c++中的CRTP是什么 c++奇异递归模板模式【
- Win11怎么设置单手模式_Win11触控键盘布局
- 如何使用Golang实现容器自动化运维_Golan
- php查询数据怎么分组_groupby分组查询配合
- Windows10系统怎么查看运行时间_Win10
- 如何使用Golang管理模块版本_Golanggo
- Mac如何解压zip和rar文件?(推荐免费工具)
- Win11输入法选字框不见了怎么办_Win11输入
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- Win11时间格式怎么改成12小时制 Win11时
- Windows10系统怎么查看CPU温度_Win1
- 如何在包含多值的列中精准搜索指定演员?
- windows如何测试网速_windows系统网络
- c++ unordered_map怎么用 c++哈
- Win11关机快捷键是什么_Win11快速关机方法
- Win11怎么设置任务栏透明_Windows11使
- Win11怎么调整屏幕亮度_Windows 11调
- Win11怎么查看wifi信号强度_检测Windo
- Linux如何使用Curl发送请求_Linux下A
- WindowsUSB驱动安装异常怎么办_USB驱动
- Win11怎么设置DNS服务器_Windows11
- 如何使用Golang实现RPC序列化与反序列化_G
- 如何在Golang中处理云原生事件_使用Event
- Python文件和流处理指南_高效读写大体积数据文
- Windows怎样拦截QQ浏览器广告_Window
- C#如何在一个XML文件中查找并替换文本内容
- PhpStorm怎么调试PHP代码_PhpStor
- Win11如何关闭游戏模式 Win11禁用Xbox
- Windows蓝屏错误0x00000018怎么处理
- c# 服务器GC和工作站GC的区别和设置
- Windows蓝屏错误0x0000001E怎么修复
- Win11怎么关闭应用权限_Windows11相机
- 如何在 Go 中高效缓存与分发网络视频流
- 如何在 Go 结构体中正确初始化 map 字段
- Win11怎么设置麦克风权限_允许应用访问Win1
- Win11关机界面怎么改_Win11自定义关机画面
- Windows10如何更改开机密码_Win10登录
- 短链接怎么用php还原_从基础原理到代码实现教学【
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- Windows10怎么备份注册表_Windows1
- 如何在Golang中捕获HTTP服务器错误_Gol
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- 如何在JavaScript中动态拼接PHP的bas
- 如何在Golang中实现自定义Benchmark_

QQ客服