PHP7.4+Laravel8环境下如何按指定数组模式拆分无空格字符串?
PHP字符串按预定义模式拆分的最优实现
针对你的需求,以下提供两种兼顾运行效率和可读性的实现方案,均适配PHP 7.4 + Laravel 8环境:
方案1:原生PHP高效实现(推荐,性能最优)
无需依赖Laravel特性,性能最高,逻辑清晰:
/** * 按指定模式拆分字符串并用空格拼接 * @param string $input 待处理的无空白字符串 * @param array $pattern 拆分模式数组,每个元素的长度为对应拆分段的长度 * @return string 拆分拼接后的结果 */ function splitStringByPattern(string $input, array $pattern): string { $offset = 0; $segments = []; foreach ($pattern as $segmentPattern) { $segmentLength = strlen($segmentPattern); $segments[] = substr($input, $offset, $segmentLength); $offset += $segmentLength; } return implode(' ', $segments); }
相比原实现的优化点:
- 不修改原始输入字符串,减少不必要的字符串拷贝开销
- 使用
implode拼接分段,无需手动处理末尾多余空格,逻辑更简洁 - 仅维护一个偏移量变量,语义更清晰,无多余中间变量
- 时间复杂度为O(n)(n为输入字符串长度),和原实现性能持平,内存占用更低
方案2:Laravel集合风格实现
如果你偏好Laravel的函数式编码风格,可以使用集合实现:
use Illuminate\Support\Collection; function splitStringByPattern(string $input, array $pattern): string { return collect($pattern) ->reduce(function (array $carry, string $segmentPattern) use ($input) { $segmentLength = strlen($segmentPattern); $carry['segments'][] = substr($input, $carry['offset'], $segmentLength); $carry['offset'] += $segmentLength; return $carry; }, ['offset' => 0, 'segments' => []])['segments'] ->join(' '); }
测试验证
你提供的两个测试用例运行结果如下:
// 测试用例1 $string = "123456789"; $format = ['XXX','XX','XXXX']; dd(splitStringByPattern($string, $format)); // 输出 "123 45 6789" // 测试用例2 $str = 'qweasdzxc'; $pattern = ['X','X','XXXX','XXX']; dd(splitStringByPattern($str, $pattern)); // 输出 "q w easd zxc"
可选扩展:长度校验
如果你的业务场景需要严格校验输入长度,可以在函数开头添加校验逻辑:
$totalRequiredLength = array_sum(array_map('strlen', $pattern)); if (strlen($input) < $totalRequiredLength) { throw new \InvalidArgumentException("输入字符串长度不足,最少需要{$totalRequiredLength}个字符"); }
内容的提问来源于stack exchange,提问作者Skywarth
相关产品推荐
相关产品推荐

