Php 使用str_替换和数组切换文本

Php 使用str_替换和数组切换文本,php,string,Php,String,关于str_replace(),我发现了一些有趣的东西。 在我的函数中,我需要进行两个mysql查询,这两个查询在排序结果上略有变化。作为一个参数,我得到了一个包含order子句的字符串,例如“姓氏ASC”,但也可以是“姓氏DESC”。现在,我想使用str_replace轻松切换到反向排序,我认为这应该可以做到: str_replace(array('ASC', 'DESC'), array('DESC', 'ASC'), $subject) 在我看来,它应该改变所有发生的ASC与DESC和所

关于str_replace(),我发现了一些有趣的东西。 在我的函数中,我需要进行两个mysql查询,这两个查询在排序结果上略有变化。作为一个参数,我得到了一个包含order子句的字符串,例如“姓氏ASC”,但也可以是“姓氏DESC”。现在,我想使用str_replace轻松切换到反向排序,我认为这应该可以做到:

str_replace(array('ASC', 'DESC'), array('DESC', 'ASC'), $subject)
在我看来,它应该改变所有发生的ASC与DESC和所有发生的DESC与ASC。由于字符串只包含这两个子句中的一个,所以我应该得到倒序子句。 但事实并非如此。上述代码的输出是相同的字符串

我做了一些测试,结果表明,这些调用执行了您希望它们执行的操作:

str_replace('ASC', 'DESC', $subject)
str_replace(array('ASC'), array('DESC'), $subject)
在我看来这很奇怪,因为

array('ASC', 'DESC') != array('DESC', 'ASC')

为什么PHP会认为这是平等的?有没有其他方法可以使这种替换更容易呢?

事实上,我只是猜测:替换是连续的。这意味着,它首先将
ASC
替换为
DESC
,然后将
DESC
替换为
ASC
,这将再次生成相同的字符串

更新:看来,我是对的

php > $a = 'I am a string';
php > var_dump(str_replace(array('am', 'is'), array('is', 'k'), $a));
string(12) "I k a string"
首先,它将
am
替换为
is
(第一个条目),然后将
is
替换为
k
PHP首先“呈现”第一个参数,以您想要的方式更改所有出现的情况(所有
ASC
设置为
DESC


但随后您传递了第二个参数,表示执行相反的操作,因此所有
DESC
s都设置为
ASC
,基本上将第一个参数置零。

在这种情况下,您可以这样使用:

这将起作用,因为

如果给定两个参数,则第二个参数应为以下形式的数组
数组('from'=>'到',…)
。返回值是一个字符串,其中所有 数组键的引用已替换为相应的 价值观最长的钥匙将首先试用。一旦子字符串 已替换,将不会再次搜索其新值

使用
stru_replace
发生的事情,正如您已经发现的,首先
ASC
DESC
替换,然后
DESC
被替换回
ASC
,因为总共没有做任何事情

strtr($subject, array('ASC' => 'DESC', 'DESC' => 'ASC'));