Prima differenza:
Un esempio interessante di un comportamento diverso tra strtr
e si str_replace
trova 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 aspetto come risultato: "ZDDB"
- Tuttavia, questo ritorno: "ZDDD" (perché B = D secondo il nostro array)
Per farlo funzionare, usa invece "strtr":
<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
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 seguente codice (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 righe di testo risultanti saranno:
string (3) "PHP"
string (27) "PHP: Hypertext Preprocessor"
La spiegazione principale:
Questo accade perché:
strtr : ordina i suoi parametri in base alla lunghezza, in ordine decrescente, quindi:
- darà "più importanza" a quello più grande e poi, poiché il testo dell'oggetto è esso stesso la chiave più grande dell'array di sostituzione, verrà tradotto.
- poiché tutti i caratteri del testo dell'oggetto sono stati sostituiti, il processo finisce qui.
str_replace : funziona nell'ordine in cui sono definite le chiavi, quindi:
- trova la chiave "PHP" nel testo dell'oggetto e la sostituisce con: "PHP: Hypertext Preprocessor", cosa dà come risultato:
"PHP: Hypertext Preprocessor: Hypertext Preprocessor".
quindi trova la chiave successiva: "PHP: Hypertext Preprocessor" nel testo risultante del passaggio precedente, quindi viene sostituito da "PHP", che dà come risultato:
"PHP: Hypertext Preprocessor".
non ci sono più chiavi da cercare, quindi la sostituzione finisce qui.
strtr
potrebbe essere facilmente interpretato male in quantostrstr
è molto diverso. Comincio a pensare di essere dislessico. Non commetterò questo errore con str_replace.