
本文介绍如何在 php 中实现基于最大字符长度的单词分组换行功能,将单词数组按行拼接为以短横线分隔的字符串,确保每行总长度不超过指定限制,并保持单词完整性。
本文介绍如何在 php 中实现基于最大字符长度的单词分组换行功能,将单词数组按行拼接为以短横线分隔的字符串,确保每行总长度不超过指定限制,并保持单词完整性。
在文本排版或前端渲染场景中,常需将一组单词“智能折行”——即在不拆分单个单词的前提下,尽可能多地将连续单词组合成一行,且整行(含分隔符)长度 ≤ 给定上限。本教程提供一种简洁、健壮、符合语义逻辑的 PHP 实现方案。
核心思路是:先空格拼接 → 借助 wordwrap() 按字符数软换行 → 再按换行符切分 → 最后将每行空格替换为短横线 -。该方法巧妙复用 PHP 内置函数 wordwrap() 的单词边界保护机制(它默认不会在单词中间截断),避免手动遍历和复杂的状态管理。
以下是完整可运行的函数实现:
/**
* 将单词数组按最大行宽进行分组换行,单词间以 '-' 连接
*
* @param array $words 单词字符串数组
* @param int $maxLineLength 每行最大允许字符数(含 '-')
* @return array 分组后的字符串数组
*/
function wrapLines(array $words, int $maxLineLength): array
{
if (empty($words)) {
return [];
}
// 1. 用空格连接所有单词(wordwrap 要求输入为单字符串)
$joined = implode(' ', $words);
// 2. 使用 wordwrap 自动按长度折行(保留单词完整性)
// 注意:break 参数默认为 "\n",无需显式指定
$wrapped = wordwrap($joined, $maxLineLength, "\n", false);
// 3. 按换行符分割为行数组,并将每行空格替换为 '-'
return array_map(
function (string $line): string {
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() 默认启用 cut = false(即不强制截断单词),天然满足“不拆单词”的业务约束;
- implode(' ', ...) → wordwrap(...) → explode("\n", ...) 形成清晰的数据流管道,逻辑内聚、易于测试与维护;
- 使用 array_map 和匿名函数封装转换逻辑,语义明确,无副作用;
- 函数签名明确标注类型(array, int, string),增强可读性与 IDE 支持。
⚠️ 注意事项:
- 若输入单词本身长度 > $maxLineLength(如 ["supercalifragilisticexpialidocious"] 且 $maxLineLength = 10),wordwrap() 仍会将其独占一行(因 cut=false),这是合理行为——单个超长词无法拆分,必须独占一行;
- 确保输入 $words 元素均为非空字符串,否则 trim() 和 str_replace() 可能产生意外空行,建议前置过滤:array_filter($words, 'strlen');
- 如需兼容多字节字符(如中文),应改用 mb_ 系列函数(如 mb_wordwrap 需自行实现),但本例中 wordwrap() 对 ASCII 单词完全可靠。
该方案兼顾简洁性、可读性与工程鲁棒性,适用于日志摘要、标签云、响应式文本卡片等需要动态控制行宽的 PHP 应用场景。











