You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP按单词数拆分字符串为两部分,奇数词时第二部分多一词

解决PHP字符串按单词拆分时奇数单词分配问题

我写了一个PHP函数,按照单词数把字符串拆成两部分,每部分用<span>标签包裹。当原字符串单词数为奇数时,希望第二个<span>能多包含1个单词,但当前代码会把额外的单词分到第一个<span>里。

现有代码:

$array  = explode( ' ', 'Lorem ipsum dolor sit amet' );
$count = count( $array );
$per_part = max( round( $count / 2 ), 1 );
$new_array     = [];

for ( $i = 0; $i < 2; $i++ ) {
    $new_array[] = array_slice( $array, $i * $per_part, $per_part );
}

$first_string = join(' ', $new_array[0]);
$second_string = join(' ', $new_array[1]);

$new_string = '<span>' . $first_string . '</span>' . ' <span>' . $second_string . '</span>';
echo htmlspecialchars($new_string);

当前结果:

<span>Lorem ipsum dolor</span> <span>sit amet</span>

期望结果:

<span>Lorem ipsum</span> <span>dolor sit amet</span>

问题原因

问题出在round($count / 2)的计算逻辑上。当单词数为奇数时(比如示例中的5个),5/2=2.5,round()会向上取整得到3,导致第一部分直接分到3个单词,第二部分只能拿到剩下的2个。

修正方案

把round()替换为floor()(向下取整),让第一部分只分到单词总数的一半整数部分,剩下的所有单词自动归到第二部分。更简洁的写法可以直接拆分两部分,不用循环:

$array  = explode( ' ', 'Lorem ipsum dolor sit amet' );
$count = count( $array );
// 第一部分取总数的一半整数部分
$first_part_length = floor($count / 2);

$first_array = array_slice($array, 0, $first_part_length);
// 第二部分从第一部分结束的位置取到末尾
$second_array = array_slice($array, $first_part_length);

$first_string = join(' ', $first_array);
$second_string = join(' ', $second_array);

$new_string = '<span>' . $first_string . '</span>' . ' <span>' . $second_string . '</span>';
echo htmlspecialchars($new_string);

修正后结果

运行上述代码后,会得到符合预期的输出:

<span>Lorem ipsum</span> <span>dolor sit amet</span>

内容的提问来源于stack exchange,提问作者user13286

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:16:28