
本文介绍一种高效、简洁的 PHP 方法,将包含 ASCII 字母与数字的无序字符数组,按 ASCII 码顺序合并为连续字符范围(如 'A-C'、'a-f'、'0-4'),并保持原始唯一性与顺序逻辑。
本文介绍一种高效、简洁的 php 方法,将包含 ascii 字符的无序字符数组,按 ascii 码顺序合并为连续字符范围(如 'a-c'、'a-f'、'0-4'),并保持原始唯一性与顺序逻辑。
要实现字符数组的智能范围压缩——例如将 ['A','B','C','F','a','b','c','d','e','f','h','i','j','k','l','o','q','!','?','0','1','2','3','4','9'] 转换为 ['A-C','F','a-f','h-l','o','q','!','?','0-4','9']——关键在于识别ASCII 码连续的子序列,并将它们合并为 "start-end" 形式,非连续字符则单独保留。
以下是一个经过优化、可读性强且鲁棒的实现方案(已修正原答案中潜在的边界与逻辑问题):
function compressCharRange(array $chars): array {
if (empty($chars)) {
return [];
}
// 先排序(按 ASCII 值升序),确保连续性可被正确识别
usort($chars, function($a, $b) {
return ord($a) ord($b);
});
$ranges = [];
$start = $chars[0];
$end = $start;
for ($i = 1; $i !
// [1] => ?
// [2] => 0-4
// [3] => 9
// [4] => A-C
// [5] => F
// [6] => a-f
// [7] => h-l
// [8] => o
// [9] => q
// )
✅ 核心要点说明:
- 必须先排序:PHP 的 usort() 配合 ord() 确保按 ASCII 码值升序排列,这是识别连续性的前提;原答案未显式排序,依赖输入已有序,不具通用性。
- 连续性判定严谨:使用 ord($current) === ord($prev) + 1 显式判断,避免 ++$char 运算在非字母/数字(如 '!'、'?')上的不可预测行为(PHP 对特殊字符自增无定义)。
- 边界安全:空数组、单元素、全连续等边界情况均被自然覆盖。
- 输出语义清晰:单字符不带连字符(如 'F'),双字符及以上才生成 'X-Y' 格式。
⚠️ 注意事项:
- 该算法假设输入仅含唯一 ASCII 字符(题目明确约束),重复字符会导致逻辑错误,建议调用前用 array_unique() 去重。
- 若需保持原始出现顺序(而非 ASCII 顺序),则需更复杂策略(如分组预处理 + 多轮扫描),但会牺牲时间效率;本方案以语义合理性和性能为优先。
- 特殊符号(!, ?, 空格等)因其 ASCII 码不连续于字母/数字,将各自独立成项,符合预期。
总结:此方案兼顾可读性、健壮性与执行效率,适用于配置解析、权限字符集压缩、URL 安全编码范围生成等实际场景。推荐在生产环境中直接封装为工具函数复用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











