当前位置: 首页 > 面试题库 >

何时使用strtr vs str_replace?

云欣嘉
2023-03-14
问题内容

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

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


问题答案:

第一个区别:

之间不同的行为的一个有趣的例子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. 没有更多要查找的键,因此替换到此结束。


 类似资料:
  • 问题内容: 我一直在nodejs中编程,研究了如何同时使用socket.io和对节点服务器的ajax调用。socket.io是否设计为替代ajax?我很好奇,在哪种情况下使用socket.io更好,而哪种ajax更好。感谢您的输入。 问题答案: 好吧,Web套接字(通过socket.io)提供的主要内容之一就是ajax缺乏的是服务器推送。因此,对于ajax,如果您想了解服务器上的新事件(例如,另一

  • 我和我的团队一直在使用Spring boot开发一系列微服务。由于服务经历了JUnit和Spring Boot升级(我们现在使用的是Spring Boot 2和JUnit 5),不同开发人员实现的不同JUnit现在使用不同的模式: @扩展为 今天,它们之间的区别是什么?我们真的需要它们来进行单元测试还是嵌入到一些新的Spring Boot注释中?

  • 问题内容: 我得到了asyncio在Python 3.5 中使用的流程,但是我还没有看到关于我应该使用什么东西,我不应该使用的await东西或者它在哪里容易出现的描述。我是否仅需要根据“这是IO操作并应进行await编辑” 来做出最好的判断? 问题答案: 默认情况下,所有代码都是同步的。你可以使用使其异步定义函数,async def并使用来“调用”这些函数await。一个更正确的问题是“什么时候应

  • 问题内容: 我感觉好像总是被教导要使用s,并且我经常看到它们与s 混合使用,以在应该在不同页面上执行相同操作的几段代码中完成相同类型的查询。开始: 那就是我正在从事的工作: 我看到很多像: 似乎LEFT也可能是INNER,有没有抓住的机会? 问题答案: 有收获吗?是的-左联接是外联接的一种形式,而内联接是内联接的一种形式。 这是显示差异的示例。我们将从基本数据开始: 在这里,我们将看到内部联接和左

  • 问题内容: 定制JPA映射器类具有以下方法: 如果我正确理解clear(),它将从上下文中删除所有持久性实体。-资源 但是,我也在这里阅读, 关于何时调用clear()的明确准则是什么? 问题答案: 文章对此进行了解释。清除实体管理器将清空其关联的缓存,从而迫使新的数据库查询在事务中稍后执行。使用事务绑定的实体管理器时,几乎几乎不需要清除实体管理器。我看到有两个原因需要清除: 在进行批处理时,为了

  • 我编写jUnit测试用例有3个目的: 确保我的代码满足所有(或大部分)输入组合/值下所需的所有功能。 以确保我可以更改实现,并依靠JUnit测试用例来告诉我,我的所有功能仍然得到满足。 作为我的代码处理的所有用例的文档,并作为重构的规范--如果需要重写代码的话。(重构代码,如果我的jUnit测试失败--您可能错过了一些用例)。 我不明白为什么或者什么时候应该使用。当我看到被调用时,它告诉我,我的j

  • 自定义JPA映射器类有一个方法: 如果我正确理解clear(),它将从上下文中删除所有持久实体-来源 然而,我也在这里读到, 关于何时调用 clear() 的明确准则是什么?

  • 我正在阅读OracleDocGenericmethod中的泛型方法。当它说什么时候使用通配符和什么时候使用泛型方法时,我对比较感到很困惑。引用文档。 我们本可以在这里使用通用方法: [...]这告诉我们类型参数正被用于多态;它的唯一作用是允许在不同的调用站点使用各种实际的参数类型。如果是这样的话,应该使用通配符。通配符旨在支持灵活的子类型,这就是我们在这里试图表达的。 我们不觉得像《代码》(Col