这是我刚刚发现的有关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会认为这是平等的?有没有其他方法可以轻松进行这种替换?
答案 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