一尘不染

何时使用strtr vs str_replace?

php

我很难理解什么时候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

除了语法之外,使用一种语法还有什么好处?在任何情况下都不足以达到预期的结果吗?


阅读 283

收藏
2020-05-26

共1个答案

一尘不染

第一个区别:

之间不同的行为的一个有趣的例子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只是简单地逐个转换字符。


另一个区别:

给定以下代码(摘自PHP字符串替换速度比较):

<?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);
?>

结果文本行将是:

字符串(3)“ PHP”
字符串(27)“ PHP:超文本预处理器”


主要说明:

发生这种情况是因为:

  • strtr :按长度降序对参数进行排序,因此:

    1. 它会给最大的那个“更重要”,然后,由于主题文本本身就是替换数组的最大键,因此它被翻译了。
    2. 因为已替换了主题文本的所有字符,所以该过程到此结束。
    3. str_replace :它按定义键的顺序工作,因此:

    4. 它在主题文本中找到键“ PHP”,并将其替换为:“ PHP:超文本预处理器”,其结果如下:

“ PHP:超文本预处理器:超文本预处理器”。

2. 然后在上一步的结果文本中找到下一个键:“ PHP:超文本预处理器”,因此将其替换为“ PHP”,其结果为:

“ PHP:超文本预处理器”。

3. 没有更多要查找的键,因此替换到此结束。
2020-05-26