2011-11-18 45 views
65

我很難理解何時strtr優於str_replace,反之亦然。似乎可以使用任一函數來獲得完全相同的結果,儘管子字符串被替換的順序是相反的。例如:何時使用strtr函數的效率VS 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 

除了語法,有使用一個比其他任何好處?任何情況下,不足以達到預期結果?

+3

從可讀性的角度來看,'strtr'可能很容易被誤解爲'strstr',這是非常不同的。我開始認爲我有誦讀困難。用str_replace不會犯這個錯誤。 – Programster

回答

104

第一個區別:

strtrstr_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 String Replacement Speed Comparison截取):

<?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」
string(27) 「PHP:Hypertext Preprocessor的」


主要說明:

這是因爲:

  • strtr函數的效率:它的長度對其進行排序參數,按降序排列,所以:

    1. 它會給予最大的「更重要」,然後,因爲主題文本本身是替換數組的最大關鍵字,它會被翻譯。
    2. 因爲主題文本的所有字符都已被替換,所以過程在此結束。
  • str_replace函數:它工作在鍵定義的順序,所以:

    1. 它找到的關鍵「PHP」爲主題的文字,並替換它:「PHP:Hypertext Preprocessor的「,結果如下:

      」PHP:Hypertext Preprocessor:Hypertext Preprocessor「。

    2. 然後找到下一個關鍵:「PHP:Hypertext Preprocessor的」,在出現的前一步的文本,所以它得到由「PHP」,這給作爲結果所取代:

      「 PHP:超文本預處理器「。

    3. 沒有更多鑰匙可供查找,所以更換結束。

+1

好的謝謝!我沒有意識到strtr正在翻譯的長度 - 我認爲它是在相反的順序。 – andrewtweber

+0

正如php.net中所記錄的,函數str_replace還有一個名爲「count」的參數,用於指示替換應該執行多少次。但我無法使用這個參數。有誰知道爲什麼? –

+1

@ vantrung-cuncon這不是那個參數的用途。文檔說:「這將被設置爲執行替換的次數。」如果你想限制str_replace到一定數量的替換,你將需要找到另一個解決方案。 – jdhartley

14

看來,有可能實現使用任何功能

這並不總是正確的,並且依賴於搜索完全相同的結果,並取代你提供的數據。例如其中兩個功能不同,請參見:Does PHP str_replace have a greater than 13 character limit?

  • strtr不會在已經被替換部分字符串替換 - str_replace將取代內取代。
  • strtr將開始與最長的鍵第一個情況下,你有兩個參數稱之爲 - str_replace將取代由左到右。
  • str_replace可以返回進行更換的次數 - strtr不提供這樣的計數值。
4

我認爲strtr用兩個參數一起使用時,例如提供了更加靈活和有條件的替換:如果字符串是1,具有取代的,但如果字符串是10,用b替換。這個技巧只能通過strtr來實現。

$string = "1.10.0001"; 
echo strtr($string, array("1" => "a", "10" => "b")); 
// a.b.000a 

參見:Php Manual Strtr

1

在手動 STRTR-- 說明 串strtr函數的效率(字符串$ STR,從字符串$,字符串$到) 串strtr函數的效率(字符串$ STR,數組$ replace_pairs) 通知如果給定的三個參數,此函數返回STR的副本哪裏..​​.

STR_REPLACE-- ... 如果搜索或替換的陣列,它們的元素被處理第一個到最後。 ...

STRTR每轉都不影響下一個,但STR_REPLACE會。