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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:09:03