Trudno mi zrozumieć, kiedy strtr
byłoby lepsze str_replace
lub odwrotnie. Wydaje się, że możliwe jest osiągnięcie dokładnie tych samych wyników przy użyciu obu funkcji, chociaż kolejność, w której zastępowane są podciągi, jest odwrotna. Na przykład:
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');
To wychodzi
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
Oprócz składni, czy jest jakaś korzyść z używania jednego nad drugim? Czy są przypadki, w których nie wystarczyłoby do osiągnięcia pożądanego rezultatu?
php
string
str-replace
strtr
andrewtweber
źródło
źródło
strtr
może być łatwo odczytany, ponieważstrstr
jest zupełnie inny. Zaczynam myśleć, że mam dysleksję. Nie popełnię tego błędu z str_replace.Odpowiedzi:
Pierwsza różnica:
Ciekawy przykład innego zachowania między
strtr
istr_replace
znajduje się w sekcji komentarzy podręcznika PHP:<?php $arrFrom = array("1","2","3","B"); $arrTo = array("A","B","C","D"); $word = "ZBB2"; echo str_replace($arrFrom, $arrTo, $word); ?>
Aby to zadziałało, użyj zamiast tego „strtr”:
<?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?>
Oznacza to, że
str_replace
jest to bardziej globalne podejście do zastępowania, podczas gdystrtr
po prostu tłumaczy znaki jeden po drugim.Kolejna różnica:
Biorąc pod uwagę następujący kod (wzięty z porównania szybkości zastępowania ciągów 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); ?>
Wynikowe wiersze tekstu będą wyglądać następująco:
Główne wyjaśnienie:
Dzieje się tak, ponieważ:
strtr : sortuje swoje parametry według długości, w porządku malejącym, więc:
str_replace : działa w kolejności, w jakiej klucze są zdefiniowane, więc:
następnie znajduje następny klucz: „PHP: Hypertext Preprocessor” w wynikowym tekście poprzedniego kroku, więc jest zastępowany przez „PHP”, co daje w rezultacie:
nie ma już kluczy do poszukiwania, więc wymiana kończy się na tym.
źródło
strtr
nie zastąpi tekstu wstawionego przez poprzednie zamiany.strtr('foo', array('oo' => 'ie', 'e' => 't'))
zwraca'fie'
zamiast'fit'
jakstr_replace
robi. W ten sposób automatycznie rozwiązuje problem podniesiony przez @Pies.Nie zawsze jest to prawdą i zależy od podanych przez Ciebie danych wyszukiwania i zamiany. Na przykład, gdy te dwie funkcje się różnią, zobacz: Czy PHP str_replace ma więcej niż 13 znaków?
strtr
nie zastąpi w częściach ciągu, które zostały już zastąpione -str_replace
zamieni wewnątrz zastępuje.strtr
rozpocznie się od najdłuższego klucza w przypadku wywołania go z dwoma parametrami -str_replace
zostanie zastąpiony od lewej do prawej.str_replace
może zwrócić liczbę wykonanych wymian -strtr
nie podaje takiej wartości licznika.źródło
Myślę, że
strtr
zapewnia bardziej elastyczne i warunkowe zastępowanie, gdy jest używane z dwoma argumentami, na przykład: jeśli ciąg wynosi 1, zamień na a, ale jeśli ciąg ma wartość 10, zamień na b. Tę sztuczkę można było osiągnąć tylko przezstrtr
.$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // a.b.000a
zobacz: Podręcznik Php Strtr .
źródło
Uwaga w instrukcji STRTR - Opis string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, tablica $ replace_pairs) Jeśli podano trzy argumenty, funkcja zwraca kopię gdzie ...
STR_REPLACE-- ... Jeśli wyszukiwanie lub zamiana są tablicami, ich elementy są przetwarzane od pierwszego do ostatniego . ...
STRTR w każdej turze NIE ma wpływu na następną, ALE STR_REPLACE tak.
źródło