
本文介绍如何在 PHP 中将单词数组按最大字符数分行为多行字符串,每行尽可能多地包含完整单词,并以单个连字符 - 连接各单词,确保每行总长度不超过限制。
本文介绍如何在 php 中将单词数组按最大字符数分行为多行字符串,每行尽可能多地包含完整单词,并以单个连字符 `-` 连接各单词,确保每行总长度不超过限制。
要实现符合题意的 "word-wrap" 功能——即:给定单词数组和每行最大字符数,输出由若干字符串组成的数组,每个字符串是若干完整单词用 - 拼接而成、且长度 ≤ 最大限制——关键在于保留单词完整性(不可截断单词),同时贪心填充每行。
虽然 wordwrap() 原生用于空格分隔文本,但稍作适配即可高效解决本题。核心思路如下:
- 先将单词数组用空格拼接成单字符串(join(' ', $words));
- 调用 wordwrap($str, $maxLen, "\n", true) —— 注意第 4 参数设为 true 可强制在单词边界换行(避免断词);
- 用 explode("\n", ...) 拆分为行数组;
- 对每一行,将空格替换为 -(str_replace(' ', '-', $line));
- 返回处理后的行数组。
以下是完整、健壮的实现代码:
function wrapLines(array $words, int $maxLength): array
{
if (empty($words)) {
return [];
}
// 步骤1:拼接为空格分隔字符串
$text = implode(' ', $words);
// 步骤2:按 maxLength 换行(true 表示 break at word boundaries)
$wrapped = wordwrap($text, $maxLength, "\n", true);
// 步骤3:按换行符分割,并将每行空格转为连字符
return array_map(function ($line) {
return str_replace(' ', '-', trim($line));
}, explode("\n", $wrapped));
}
// 示例调用
$words1 = [
"The", "day", "began", "as", "still", "as", "the",
"night", "abruptly", "lighted", "with", "brilliant", "flame"
];
$result = wrapLines($words1, 13);
print_r($result);✅ 输出结果完全匹配预期:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => The-day-began
[1] => as-still-as
[2] => the-night
[3] => abruptly
[4] => lighted-with
[5] => brilliant
[6] => flame
)⚠️ 注意事项与优化提示:
- wordwrap(..., ..., ..., true) 是关键:若省略第 4 参数或设为 false,函数可能在单词中间截断(如 "abruptly" → "abru" + 换行),违反题目“完整单词”要求;
- 输入为空数组时需显式返回 [],避免 implode 报错或产生意外空字符串;
- 单词本身长度 > $maxLength(如 "supercalifragilisticexpialidocious" 超过 13)时,wordwrap 默认仍会将其单独成行(因无法拆分),这符合题意中“as many words as possible”的逻辑(此时最多 1 个);
- 如需更精细控制(如跳过超长单词、自定义分隔符逻辑),可改用手动贪心算法,但对绝大多数场景,wordwrap 方案简洁、高效且经过充分测试。
该方案兼顾可读性、健壮性与性能,是 PHP 中实现此类“语义化折行”的推荐实践。











