我很难理解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
除了语法之外,使用其中一个是否有任何好处?任何人都不足以达到预期结果的情况?
答案 0 :(得分:124)
第一个区别:
strtr
和str_replace
之间不同行为的一个有趣示例位于PHP手册的评论部分:
<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
要使其工作,请改用“strtr”:
<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
这意味着str_replace
是一种更全面的替代方法,而strtr
只是逐个翻译字符。
另一个不同之处:
给出以下代码(取自PHP String Replacement Speed Comparison):
<?php
$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”
主要解释:
这是因为:
strtr :它按长度按降序对其参数进行排序,因此:
str_replace :它按照定义键的顺序工作,所以:
“PHP:超文本预处理器:超文本预处理器”。
然后它在前一步的结果文本中找到下一个键:“PHP:Hypertext Preprocessor”,因此它被“PHP”替换,结果如下:
“PHP:超文本预处理器”。
没有更多的钥匙要找,所以替换就此结束。
答案 1 :(得分:18)
似乎可以使用任一函数
来获得完全相同的结果
这并不总是正确的,取决于您提供的搜索和替换数据。例如,两个函数不同的地方请参见:Does PHP str_replace have a greater than 13 character limit?
strtr
不会替换已被替换的字符串部分 - str_replace
将替换内部替换。strtr
将以最长的密钥开头,以防您使用两个参数调用它 - str_replace
将从左到右替换。str_replace
可以返回已完成的替换次数 - strtr
不提供此类计数值。答案 2 :(得分:5)
我认为strtr
在与两个参数一起使用时提供更灵活和有条件的替换,例如:如果string为1,则替换为a,但如果string为10,则替换为b。这个技巧只能通过strtr
实现。
$string = "1.10.0001";
echo strtr($string, array("1" => "a", "10" => "b"));
// a.b.000a
请参阅:Php Manual Strtr。
答案 3 :(得分:1)
手册中的注意事项 STRTR-- 描述 string strtr(string $ str,string $ from,string $ to) string strtr(string $ str,array $ replace_pairs) 如果给出三个参数,则此函数返回str的副本,其中...
STR_REPLACE-- ... 如果搜索或替换是数组,则会对其元素进行从头到尾的处理。 ...
STRTR每次转弯都不会影响到下一次,但是STR_REPLACE会。