2011-12-09 59 views
3

以下是我剛纔發現的有關str_replace()的一些有趣內容。 在我的函數中,我需要做兩個mysql查詢,這與排序結果時的輕微更改是一樣的。作爲一個參數,我得到了包含一個order子句的字符串,例如'surname ASC',但它也可以是'surname DESC'。現在,我想輕鬆切換到倒車str_replace函數使用排序,我想這應該做的伎倆:使用str_replace和數組切換文本

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

在我的腦海裏應該改變ASC與DESC和DESC中所有出現的所有出現與ASC。由於字符串只包含兩個中的一個,所以我應該得到顛倒的順序子句。 但事實並非如此。上面的代碼的輸出是相同的字符串。

我做了一些測試,它tourned的是,這些來電做你想讓他們做什麼:

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

在我看來這是奇怪,因爲

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

那麼,爲什麼PHP會認爲這作爲平等?有沒有其他方法可以輕鬆地進行這種替換?

回答

4

在這種情況下,你可以使用strtr像這樣:

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

這工作,因爲

如果給定兩個參數,第二個應該是形式 array('from' => 'to', ...)數組。返回值是一個字符串,其中所有 數組鍵的出現已被對應的 值所取代。最長的鍵將首先嚐試。一旦子字符串 被替換,其新值不會再被搜索。

See it in action

隨着str_replace會發生什麼,因爲你已經發現了,是第一ASC被替換爲DESC,然後DESC被替換回ASC,對於總計一事無成。

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" 

首先,它代替amis(第一項),然後用isk

3

PHP 「渲染」 的第一個參數第一,改變所有發生的事情都是你想要的(所有ASC設置爲DESC)。

但是,然後你通過第二個參數說做相反,所以所有DESC s被設置爲ASC,基本上沒有你的第一個參數。