Estou tendo dificuldade em entender quando strtr
seria preferível str_replace
ou 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', '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');
Isso produz
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
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
andrewtweber
fonte
fonte
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.Respostas:
Primeira diferença:
Um exemplo interessante de um comportamento diferente entre
strtr
estr_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); ?>
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, enquantostrtr
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:
A principal explicação:
Isso acontece porque:
strtr : classifica seus parâmetros por comprimento, em ordem decrescente, então:
str_replace : funciona na ordem em que as chaves são definidas, então:
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:
não há mais chaves para procurar, portanto, a substituição termina aí.
fonte
strtr
não substituirá o texto inserido por substituições anteriores.strtr('foo', array('oo' => 'ie', 'e' => 't'))
retorna em'fie'
vez de'fit'
comostr_replace
faz. Assim, ele resolve automaticamente o problema levantado por @Pies.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?
strtr
não substituirá partes da string que já foram substituídas -str_replace
substituirá dentro de substituições.strtr
começará com a chave mais longa primeiro, no caso de você chamá-la com dois parâmetros -str_replace
substituirá da esquerda para a direita.str_replace
pode retornar o número de substituições feitas -strtr
não oferece esse valor de contagem.fonte
Acho que
strtr
oferece 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 porstrtr
.$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // a.b.000a
veja: Php Manual Strtr .
fonte
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 . ...
STRTR de cada turno NÃO tem efeito para o próximo, MAS STR_REPLACE tem.
fonte