有时很难理解何时最好使用strtr
以及何时使用str_replace
。尽管替换子字符串的顺序相反,但似乎它们中的任何一个都可以获得相同的结果。例如:
echo strtr('test string', 'st', 'XY')."\n";
echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n";
echo str_replace(array('s', 't', 'st'), array('X', 'Y', 'Z'), 'test string')."\n";
echo str_replace(array('st', 't', 's'), array('Z', 'Y', 'X'), 'test string');
作为输出交付:
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
除了语法之外,使用其中一种有什么好处吗?是否存在不足以获得预期结果的情况?
翻译说明: 原始问题由@andrewtweber 提出并由我自己在英文 StackOverflow 网站上回答。
第一个区别:
在 PHP 手册的注释部分可以找到一个有趣的例子,说明
strtr
和之间的区别行为:str_replace
为了使这项工作按预期工作,最好使用
strtr
:这意味着它
str_replace
采用更全局的方法来替换,同时strtr
简单地逐个翻译字符。其他区别:
给定以下代码:(取自PHP String Replacement Speed Comparison):
结果文本行将是:
主要解释:
这种行为的原因是:
strtr:按长度对参数进行降序排序,因此:
str_replace:按照定义键的顺序工作,因此:
作为 Nicolás 解释的补充,结果因函数的行为而异。
除此之外,小字符串的响应时间不会很明显,但是长度越长,str_replace所需的时间就越长。
假设我们有一个 100 个字符的主字符串,让我们去找 10 个字符:
因此,如果strtr的匹配项将执行少于一千次搜索,而使用str_replace将始终执行一千次搜索,无论是否存在匹配项。