2011-11-18 19 views
65

Ho difficoltà a capire quando strtr sarebbe preferibile a str_replace o viceversa. Sembra che sia possibile ottenere gli stessi esatti risultati usando entrambe le funzioni, sebbene l'ordine in cui le sottostringhe vengono sostituite sia invertito. Ad esempio:Quando utilizzare 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'); 

Questo emette

YeXY XYring 
YeZ Zring 
YeXY XYring 
YeZ Zring 

parte sintassi, c'è qualche vantaggio di utilizzare uno sopra l'altro? Ogni caso in cui uno non sarebbe sufficiente per ottenere un risultato desiderato?

+3

Dal punto di vista della leggibilità, 'strtr' potrebbe facilmente essere letto erroneamente come' strstr', che è piuttosto diverso. Sto iniziando a pensare di essere dislessico. Non commetteremo questo errore con str_replace. – Programster

risposta

104

prima differenza:

Un interessante esempio di un comportamento diverso tra il strtr e str_replace è nella sezione commenti del Manuale PHP:

<?php 
$arrFrom = array("1","2","3","B"); 
$arrTo = array("A","B","C","D"); 
$word = "ZBB2"; 
echo str_replace($arrFrom, $arrTo, $word); 
?> 
  • mi aspetterei come risultato : "ZDDB"
  • Tuttavia, questo ritorno: "ZDDD" (Becaus e B = D secondo il nostro array)

Per fare questo lavoro, usa "strtr" invece:

<?php 
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); 
$word = "ZBB2"; 
echo strtr($word,$arr); 
?> 
  • Questo restituisce: "ZDDB"

Ciò significa che str_replace è un approccio più globale alle sostituzioni, mentre strtr traduce semplicemente i caratteri uno per uno.


Un'altra differenza:

Dato il codice seguente (tratto da 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); 
?> 

Le linee risultanti di testo sarà:

stringa (3) "PHP"
stringa (27) "PHP: Hypertext Preprocessor"


La spiegazione principale:

Ciò accade perché:

  • strtr: smista i parametri per lunghezza, in ordine decrescente , quindi:

    1. darà "più importanza" a quello più grande e quindi, poiché il testo dell'oggetto è esso stesso la chiave più grande dell'array sostitutivo, viene tradotto.
    2. poiché tutti i caratteri del testo dell'oggetto sono stati sostituiti, il processo termina qui.
  • str_replace: funziona nell'ordine in cui le chiavi vengono definite, quindi:

    1. trova la chiave “PHP” nel testo soggetto e lo sostituisce con: “PHP: Hypertext Preprocessor ", Cosa dà come risultato:

      " PHP: preprocessore ipertestuale: preprocessore ipertestuale ".

    2. allora trova il tasto successivo: “PHP: Hypertext Preprocessor” nel testo risultante della prima fase, in modo che viene sostituito da "PHP", che dà come risultato:

      “ PHP: Hypertext Preprocessor ".

    3. non ci sono più chiavi da cercare, quindi la sostituzione finisce lì.

+1

Ah ok grazie! Non mi rendevo conto che strtr si stava traducendo per lunghezza - pensavo che fosse nell'ordine inverso. – andrewtweber

+0

Come documentato in php.net, la funzione str_replace ha un altro parametro chiamato "conteggio" per indicare quante volte deve essere eseguita la sostituzione. Ma non sono in grado di usare questo parametro comunque. Qualcuno sa perché? –

+1

@ vantrung-cuncon Questo non è ciò a cui è destinato questo parametro. I documenti dicono: "Questo sarà impostato sul numero di sostituzioni eseguite". Sarà necessario trovare un'altra soluzione se si desidera limitare str_replace a una determinata quantità di sostituzioni. – jdhartley

14

Sembra che è possibile ottenere gli stessi risultati esatti utilizzando sia la funzione

Questo non è sempre vero e dipende dalla ricerca e sostituzione dei dati da Lei forniti. Ad esempio in cui la funzione due differire vedere: Does PHP str_replace have a greater than 13 character limit?

  • strtr non sostituirà in parti della stringa che già sono stati sostituiti - str_replace sostituirà all'interno sostituisce.
  • strtr inizierà con la chiave più lunga prima nel caso in cui si chiama con due parametri - str_replace sostituirà da sinistra a destra.
  • str_replace può restituire il numero di sostituzioni effettuate - strtr non offre tale valore di conteggio.
4

ritengo strtr fornisce sostituzione più flessibile e condizionale quando viene utilizzato con due argomenti, ad esempio: se stringa è 1, sostituirlo con uno, ma se stringa è 10, sostituire con b. Questo trucco potrebbe essere raggiunto solo da strtr.

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

vedere: Php Manual Strtr.

1

Avviso nel manuale STRTR-- Descrizione stringa strtr (string $ str, string $ da, string $ a) stringa strtr (string $ str, array $ replace_pairs) Se dato tre argomenti, restituisce questo funzione una copia di str ... dove

STR_REPLACE-- ... Se la ricerca o la sostituzione sono gli array, i loro elementi vengono elaborati primo all'ultimo. ...

STRTR ogni turno NON ha effetto sul successivo, MA STR_REPLACE lo fa.

Problemi correlati