89

我很难理解何时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

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

4

4 回答 4

143

第一个区别:

PHP 手册的注释部分中有一个关于strtr和之间不同行为的有趣示例:str_replace

<?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. 因为主题文本的所有字符都已被替换,所以过程到此结束。
  • str_replace:它按照定义键的顺序工作,所以:

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

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

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

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

    3. 没有更多要查找的密钥,因此替换到此结束。

于 2011-11-18T03:26:15.450 回答
21

似乎可以使用任一函数获得完全相同的结果

这并不总是正确的,取决于您提供的搜索和替换数据。例如,这两个函数的不同之处请参见:PHP str_replace 是否有大于 13 个字符的限制?

  • strtr不会替换已被替换的部分字符串 -str_replace将替换内部替换。
  • strtr如果您使用两个参数调用它,将首先从最长的键开始 -str_replace将从左到右替换。
  • str_replace可以返回完成的替换次数 -strtr不提供这样的计数值。
于 2011-11-18T03:21:56.263 回答
7

我认为strtr在使用两个参数时提供更灵活和有条件的替换,例如:如果字符串为 1,则替换为 a,但如果字符串为 10,则替换为 b。这个技巧只能通过 来实现strtr

$string = "1.10.0001";  
echo strtr($string, array("1" => "a", "10" => "b"));  
// a.b.000a  

请参阅:PHP 手册 Strtr

于 2011-11-18T03:48:33.550 回答
2

注意手册 STRTR-- 说明 string strtr ( string $str , string $from , string $to ) string strtr ( string $str , array $replace_pairs ) 如果给定三个参数,此函数返回 str 的副本where ...

STR_REPLACE-- ... 如果 search 或 replace 是数组,它们的元素从first 到 last处理。...

STRTR 每回合不影响下一个,但 STR_REPLACE 有效。

于 2012-09-18T21:30:33.947 回答