使用str_replace和数组切换文本

时间:2011-12-09 23:08:41

标签: php string

这是我刚刚发现的有关str_replace()的有趣内容。 在我的函数中,我需要进行两个mysql查询,这些查询与排序结果的细微变化相同。作为一个参数,我得到包含一个order子句的字符串,例如'surname ASC',但它也可以是'surname DESC'。现在我想使用str_replace轻松切换到反向排序,我认为这应该可以解决问题:

str_replace(array('ASC', 'DESC'), array('DESC', 'ASC'), $subject)

在我看来,它应该用DESC改变ASC的所有出现以及所有出现的DESC与ASC。由于字符串只包含两个中的一个我应该得到反转顺序子句。 然而,这种情况并非如此。上面代码的输出是相同的字符串。

我做了一些测试,结果发现这些电话做了你想要他们做的事情:

str_replace('ASC', 'DESC', $subject)
str_replace(array('ASC'), array('DESC'), $subject)

在我看来,这很奇怪,因为

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

为什么PHP会认为这是平等的?有没有其他方法可以轻松进行这种替换?

3 个答案:

答案 0 :(得分:4)

在这种情况下,您可以使用strtr,如下所示:

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

这将起作用,因为

  

如果给出两个参数,则第二个应该是表单中的数组   array('from' => 'to', ...)。返回值是一个所有的字符串   数组键的出现已被相应的替换   值。将首先尝试最长的密钥。一旦子字符串有   被替换后,其新值将不再被搜索。

<强> See it in action

根据str_replace发生的事情,正如您已经发现的那样,第一个ASC被替换为DESC,然后DESC被替换回ASC总而言之,没有做任何事情。

答案 1 :(得分:3)

PHP首先“渲染”第一个参数,以您希望的方式更改所有匹配项(所有ASC设置为DESC)。

但是你传递了第二个参数说相反,所以所有DESC都设置为ASC,基本上将你的第一个参数归零。

答案 2 :(得分:0)

事实上我只是猜测:替换是连续的。这意味着,它首先将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