什么时候使用strtr vs str_replace?
我很难理解什么时候strtr
比str_replace
更好,反之亦然。 看来可以使用这两个函数来获得完全相同的结果,尽pipe子string被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
除了语法之外,使用它们还有什么好处吗? 任何情况下,不足以达到预期的结果?
第一个区别:
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); ?>
- 我期望的结果是:“ZDDB”
- 但是,这个返回:“ZDDD”(因为根据我们的数组B = D)
为了使这个工作,使用“strtr”,而不是:
<?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?>
- 这返回:“ZDDB”
这意味着str_replace
是一个更全面的替代方法,而strtr
只是一个接一个地转换字符。
另一个区别:
鉴于以下代码(取自PHPstringreplace速度比较 ):
<?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:超文本预处理器”
主要解释:
这是因为:
-
strtr :它按照长度按降序排列参数,所以:
- 对最大的那个将会“更重要”,然后,因为主题文本本身就是replace数组的最大关键字,所以它被翻译出来。
- 因为主题文本的所有字符都被replace了,所以这个过程就结束了。
-
str_replace :它按照定义键的顺序工作,所以:
- 它会在主题文本中find关键字“PHP”,并用“PHP:Hypertext Preprocessor”replace它,结果如下:
“PHP:超文本预处理器:超文本预处理器”。
-
然后在前一步的结果文本中find下一个关键字:“PHP:Hypertext Preprocessor”,所以它被“PHP”取代,结果如下:
“PHP:超文本预处理器”。
-
没有更多的钥匙可以find,所以更换结束了。
- 它会在主题文本中find关键字“PHP”,并用“PHP:Hypertext Preprocessor”replace它,结果如下:
似乎可以使用任一函数来获得完全相同的结果
这并非总是如此,取决于您提供的search和replace数据。 例如,这两个函数不同的地方看: PHP的str_replace是否有超过13个字符的限制?
-
strtr
不会replace已被replace的部分string –str_replace
将replacereplace内部。 -
strtr
将以最长的键开始,以便用两个参数调用它 –str_replace
将从左到右replace。 -
str_replace
可以返回完成的replace次数strtr
不提供这样的计数值。
我认为当使用两个参数时, strtr
提供了更灵活和有条件的replace,例如:if string是1,用areplace,但如果string是10,则用breplace。 这个技巧只能通过strtr
来实现。
$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // ab000a
请参阅: Php手册Strtr 。
注意在STRTR手册 – 描述stringstrtr(string$ str,string$从,string$到)stringstrtr(string$ str,数组$replace_pairs)如果给出三个参数,此函数返回一个str的副本 …
STR_REPLACE–如果search或replace是数组,则它们的元素首先被处理到最后 。 …
每次STRTR都不会影响到下一个,但是STR_REPLACE会。