php 7.0 下 str_replace 与 strtr 批量替换性能基本持平,但 str_replace 更稳定、可控且行为可预测;strtr 存在 key 空字符串静默失败、最长匹配不可控、无法获取替换次数等隐性坑,仅纯字符映射或极简替换表且经压测验证时才建议使用 strtr。

PHP 7.0 下 str_replace 和 strtr 批量替换性能基本持平,但 str_replace 更稳定、更可控,不建议为“理论更快”而强行改用 strtr。
strtr(array) 在 PHP 7.0 的性能已追平 str_replace
实测数据明确显示:在 PHP 7.0 环境下,对相同字符串执行 1000 万次批量替换(如 ['foo'=>'bar', 'baz'=>'qux']),strtr 与 str_replace 耗时几乎一致(误差在 ±0.05 秒内)。这和 PHP 5.6 下 strtr 慢 10 倍的旧现象完全不同——PHP 7 重写了底层字符串处理逻辑,大幅优化了 str_replace 的多模式匹配路径。
所以别再信“strtr 快 4 倍”的陈旧结论,那属于 PHP 5.x 时代,且仅在极窄条件下成立(如单字符映射 + 长文本 + 高频调用)。
str_replace 的批量替换行为更符合直觉
当你传入数组做批量替换时,str_replace 按 $search 数组顺序逐个扫描并替换,且支持“替换后结果再次参与后续匹配”(即链式替换)。虽然这点有时是坑,但它是可预测、可调试的。
-
str_replace(['a','aa'], ['x','y'], 'aaa')→ 先替'a'得'xxa',再替第二个'a'得'xxx'(取决于数组顺序) -
strtr('aaa', ['a'=>'x', 'aa'=>'y'])→ 只按 key 长度降序匹配,'aa'优先,结果是'y a'(注意空格只是示意,实际为'ya')
这意味着:如果你依赖替换顺序或需要“边换边扫”,必须用 str_replace;若用 strtr 却没意识到它内部按 key 长度排序,很容易漏掉预期替换。
strtr(array) 容易踩的三个隐性坑
strtr 看似简洁,但在批量替换场景下有硬伤:
- 关联数组的 key 若含空字符串(
[''=>'x']),整个调用直接静默失败,返回原字符串,无警告 - key 中若存在重叠前缀(如
['ab'=>'X', 'abc'=>'Y']),strtr总是选最长匹配,无法强制用短的那个——你不能控制优先级 - 不支持
count引用参数,没法知道本次替换了几次;而str_replace可通过第 4 个参数拿到精确计数
这些不是文档里藏得深的细节,而是运行时就咬人的行为差异。尤其在模板渲染、日志脱敏等需精确控制的场景,str_replace 的确定性远胜于 strtr 的“黑盒匹配”。
什么时候真该用 strtr?
只有两种情况值得切到 strtr:
- 纯字符级映射,比如大小写翻转、ASCII 编码清洗:
strtr($s, 'aeiou', 'AEIOU') - 超长文本 + 极简替换表(≤5 对)+ PHP 7.0+ + 已压测确认收益,且你能接受它不报错也不提示 key 冲突
除此之外,所有“我要把一堆关键词替成另一堆”的需求,请默认用 str_replace。它的语义清晰、行为透明、调试友好——性能不再是瓶颈,可控性才是关键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











