str_repeat() 是 php 中重复字符串的内置函数,比手动循环更高效安全,但需注意参数类型、内存消耗、多字节字符兼容性等问题。

用 str_repeat() 最直接,别自己写循环
PHP 有现成函数干这事,str_repeat() 就是专为字符串重复设计的。自己用 for 或 while 拼接不仅慢,还容易漏转义、搞错边界。
常见错误是传错第二个参数——它必须是整数,传小数或负数会静默截断或返回空字符串:
-
str_repeat("a", 3)→"aaa" -
str_repeat("x", 0)→""(空字符串,不是"x") -
str_repeat("y", -2)→""(不报错,但结果为空) -
str_repeat("z", 2.9)→"zz"(自动向下取整)
重复次数超大时注意内存和性能
str_repeat() 是一次性分配内存并填充的,如果重复上万次、原字符串又较长,可能瞬间吃光内存,尤其在低配环境或 CLI 脚本里。
使用场景判断很关键:
立即学习“PHP免费学习笔记(深入)”;
- 生成分隔线、占位符、测试数据:放心用,几千次以内没问题
- 拼接日志前缀、动态 sql 模板:检查重复数是否来自用户输入,必须做范围校验
- 想重复 10 万次以上:先评估是否真需要完整字符串,考虑流式处理或改用
str_pad()+ 截断
示例:防止爆炸式内存占用
if ($count > 10000) { throw new InvalidArgumentException('重复次数不能超过 10000'); } $result = str_repeat($pattern, $count);
替代方案:str_pad() 适合补固定长度
如果你其实是要把字符串“撑到某个长度”,比如日志对齐、ID 补零,str_repeat() 反而绕路。str_pad() 更精准、更可控。
参数差异明显:
-
str_repeat($s, 5):不管原长,硬拼 5 次 -
str_pad($s, 10, "0", STR_PAD_LEFT):把$s补成总长 10,左边填"0"
兼容性没问题,PHP 4 起就支持,比 str_repeat() 还老。
多字节字符串?str_repeat() 不认 UTF-8
它按字节操作,遇到中文、emoji 等多字节字符会切开乱码。比如 str_repeat("你好", 2) 理论上安全,但若字符串含混合编码或 bom,或你用 mb_internal_encoding() 切过编码,结果不可靠。
真正要安全重复 Unicode 字符串,得自己封装:
$safe_repeat = function(string $s, int $times): string { return implode('', array_fill(0, $times, $s)); };
这个写法不碰字节,纯数组拼接,UTF-8 安全。但代价是稍慢一点,日常几百次内感知不到。
复杂点在于:没有银弹。要不要换方案,取决于你的字符串来源、长度、重复量和运行环境。别默认“能跑就行”,尤其当字符串来自 API 或数据库时,一个 emoji 就可能让 str_repeat() 输出乱码。