Quando usar strtr vs str_replace?
Estou tendo dificuldade em entender quando strtrseria preferível str_replaceou vice-versa. Parece que é possível obter exatamente os mesmos resultados usando qualquer uma das funções, embora a ordem em que as substrings são substituídas seja invertida. Por exemplo:
echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n";
Além da sintaxe, há alguma vantagem em usar um em vez do outro? Algum caso em que um não seria suficiente para alcançar o resultado desejado?
php string str-replace strtr
Do ponto de vista da legibilidade, strtrpode ser facilmente mal interpretado, pois strstré bem diferente. Estou começando a achar que sou disléxico. Não vou cometer esse erro com str_replace.
Um exemplo interessante de um comportamento diferente entre strtre str_replaceestá na seção de comentários do Manual do PHP:
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:
Isso retorna: "ZDDB"
Isso significa que str_replaceé uma abordagem mais global para substituições, enquanto strtrsimplesmente traduz os caracteres um por um.
Dado o seguinte código (retirado da comparação de velocidade de substituição de string PHP ):
, array("PHP" => "PHP: Hypertext Preprocessor"
, "PHP: Hypertext Preprocessor" => "PHP"));
As linhas de texto resultantes serão:
string (3) "PHP"
string (27) "PHP: Pré-processador de hipertexto"
A principal explicação:
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:
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í.
— Nicolás Ozimica
Ah ok obrigado! Não sabia que strtr estava traduzindo por comprimento - pensei que era na ordem inversa.
Conforme documentado em php.net, a função str_replace tem mais 1 parâmetro chamado "contagem" para indicar quantas vezes a substituição deve ser realizada. Mas não consigo usar esse parâmetro de qualquer maneira. Alguem sabe por quê ?
@ vantrung-cuncon Não é para isso que serve esse parâmetro. Os documentos dizem: "Isso será definido para o número de substituições realizadas." Você precisará encontrar outra solução se quiser limitar str_replace a uma certa quantidade de substituições.
— jdhartley
Limitar o número de substituições pode ser útil se você quiser substituir a primeira ocorrência de uma sigla pela versão estendida, ou seja, alterar a primeira ocorrência de "WHO" para "WHO (World Health Organization)".
strtrnão substituirá o texto inserido por substituições anteriores. strtr('foo', array('oo' => 'ie', 'e' => 't'))retorna em 'fie'vez de 'fit'como str_replacefaz. Assim, ele resolve automaticamente o problema levantado por @Pies.
Parece que é possível obter exatamente os mesmos resultados usando qualquer uma das funções
Isso nem sempre é verdade e depende dos dados de pesquisa e substituição que você fornece. Por exemplo, onde as duas funções diferem, consulte: PHP str_replace tem um limite de mais de 13 caracteres?
strtrnão substituirá partes da string que já foram substituídas - str_replacesubstituirá dentro de substituições.
strtrcomeçará com a chave mais longa primeiro, no caso de você chamá-la com dois parâmetros - str_replacesubstituirá da esquerda para a direita.
str_replacepode retornar o número de substituições feitas - strtrnão oferece esse valor de contagem.
Acho que strtroferece uma substituição mais flexível e condicional quando usado com dois argumentos, por exemplo: se string for 1, substitua por a, mas se string for 10, substitua por b. Este truque só poderia ser alcançado por strtr.
echo strtr($string, array("1" => "a", "10" => "b"));
veja: Php Manual Strtr .
— Arif RH
Observe no manual STRTR-- Descrição string strtr (string $ str, string $ de, string $ to) string strtr (string $ str, array $ replace_pairs) Se dados três argumentos, esta função retorna uma cópia de str onde ...
STR_REPLACE-- ... Se pesquisar ou substituir forem matrizes, seus elementos serão processados ​​do primeiro ao último . ...