gpt4 book ai didi

php - 何时使用 strtr 与 str_replace?

转载 作者:IT老高 更新时间:2023-10-28 11:57:07 33 4
gpt4 key购买 nike

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

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

最佳答案

第一个区别:

strtrstr_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 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:它按长度对参数进行降序排序,所以:

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

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

      “PHP: Hypertext Preprocessor: Hypertext Preprocessor”.

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

      “PHP: Hypertext Preprocessor”.

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

关于php - 何时使用 strtr 与 str_replace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8177296/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com