以前英文字符串替换都是用str_replace
,直到有一天发现了 strtr
, 具体用法就不赘述了,主要记录一下两个函数原理上的的区别,先贴一个例子
$text = "PHP: Hypertext Preprocessor";
$text_strtr = strtr($text , array(
"PHP" => "PHP: Hypertext Preprocessor"
, "PHP: Hypertext Preprocessor" => "PHP"
));
$text_str_replace = str_replace(
array("PHP", "PHP: Hypertext Preprocessor")
, array("PHP: Hypertext Preprocessor", "PHP")
, $text
);
var_dump($text_strtr);
var_dump($text_str_replace);
结果如下:
string(3) "PHP"
string(27) "PHP: Hypertext Preprocessor"
原理解析
str_replace
本函数按照数组的键值依次进行匹配替换,并不会因为匹配过了而终止程序
第一次全文匹配到 PHP
, 结果变为 PHP: Hypertext Preprocessor: Hypertext Preprocessor
第二次全文匹配到PHP: Hypertext Preprocessor
,结果变为PHP: Hypertext Preprocessor
strtr
本函数与str_replace
的不同在于
- 程序匹配优先级按照匹配字符串长度进行倒序排列,也就是说 不管顺序是怎样的 总是优先匹配替换字符串最长的键
- 字符串替换完成就会终止程序
本例中第一次匹配变成PHP
,全部替换完毕,程序结束。
性能差异
创建了一个包含 500 万个随机字符串的数组。以下是排名靠前的结果:
str_replace : 676.59 ms
strtr: 305.59 ms
strtr
方法在此测量中快 2.2 倍 (54.83%)。平均快 2 倍 (51%)。
参考:
https://dev.to/devmount/4-php-tricks-to-boost-script-performance-ol1
https://stackoverflow.com/questions/8177296/when-to-use-strtr-vs-str-replace