PHP如何实现仅首字母单大写单词保留格式其余转全小写
代码问题分析
- for循环未添加花括号包裹统计逻辑,仅
$counter = 0被纳入循环执行,每次遍历字符都会重置计数器,无法完成全单词大写字母数量统计。 - 字符索引语法错误:
$word[k]遗漏了变量标识$,正确写法为$word[$k],否则会被PHP识别为未定义常量触发报错。 - 计数器重置逻辑错误:计数器应该在处理每个新单词前重置,而不是在字符遍历循环中每次都重置。
- 缺少大写字母位置校验:需求要求仅当唯一的大写字母是单词首字母时才保留首字母大写格式,原代码未判断大写字母出现的位置。
- 输出逻辑不符合预期:原代码每处理完一个单词就输出换行标签,导致结果分行展示,预期为空格拼接所有单词后整行输出。
修复后完整代码
$text = 'Herman Archer LIVEs in neW YORK'; $oldWords = explode(' ', $text); $newWords = []; foreach ($oldWords as $word) { $upperCount = 0; $upperPosition = -1; $wordLength = strlen($word); // 遍历单词统计大写字母数量和位置 for ($k = 0; $k < $wordLength; $k++) { if ($word[$k] === strtoupper($word[$k])) { $upperCount++; $upperPosition = $k; // 大写数量超过1时提前终止遍历,优化性能 if ($upperCount > 1) { break; } } } // 按规则处理单词 if ($upperCount === 1 && $upperPosition === 0) { $newWords[] = ucfirst(strtolower($word)); } else { $newWords[] = strtolower($word); } } // 拼接为空格分隔的字符串输出 echo implode(' ', $newWords);
运行结果
Herman Archer lives in new york
内容的提问来源于stack exchange,提问作者Zack Fair
相关产品推荐
相关产品推荐

