Primeira diferença:
Um exemplo interessante de um comportamento diferente entre strtr
e str_replace
está na seção de comentários do Manual do PHP:
<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
- Eu esperaria como resultado: "ZDDB"
- No entanto, este retorno: "ZDDD" (Porque B = D de acordo com nossa matriz)
Para fazer isso funcionar, use "strtr" ao invés:
<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
Isso significa que str_replace
é uma abordagem mais global para substituições, enquanto strtr
simplesmente traduz os caracteres um por um.
Outra diferença:
Dado o seguinte código (retirado da comparação de velocidade de substituição de string PHP ):
<?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);
?>
As linhas de texto resultantes serão:
string (3) "PHP"
string (27) "PHP: Pré-processador de hipertexto"
A principal explicação:
Isso acontece porque:
strtr : classifica seus parâmetros por comprimento, em ordem decrescente, então:
- ele dará "mais importância" ao maior e, então, como o próprio texto do assunto é a maior chave do array de substituição, ele é traduzido.
- porque todos os caracteres do texto do assunto foram substituídos, o processo termina aí.
str_replace : funciona na ordem em que as chaves são definidas, então:
- ele encontra a chave “PHP” no texto do assunto e a substitui por: “PHP: Pré-processador de hipertexto”, o que dá como resultado:
“PHP: Hypertext Preprocessor: Hypertext Preprocessor”.
em seguida, ele encontra a próxima chave: “PHP: Pré-processador de hipertexto” no texto resultante da etapa anterior, então é substituído por "PHP", que dá como resultado:
“PHP: Pré-processador de hipertexto”.
não há mais chaves para procurar, portanto, a substituição termina aí.
strtr
pode ser facilmente mal interpretado, poisstrstr
é bem diferente. Estou começando a achar que sou disléxico. Não vou cometer esse erro com str_replace.