Pierwsza różnica:
Ciekawy przykład innego zachowania między strtri str_replaceznajduje 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);
?>
- Spodziewałbym się wyniku: „ZDDB”
- Jednak ten zwrot: „ZDDD” (Ponieważ B = D zgodnie z naszą tablicą)
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_replacejest to bardziej globalne podejście do zastępowania, podczas gdy strtrpo 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:
string (3) "PHP"
string (27) "PHP: preprocesor hipertekstu"
Główne wyjaśnienie:
Dzieje się tak, ponieważ:
strtr : sortuje swoje parametry według długości, w porządku malejącym, więc:
- nada „większe znaczenie” największemu, a następnie, ponieważ tekst tematu jest sam w sobie największym kluczem tablicy zastępczej, zostanie przetłumaczony.
- ponieważ wszystkie znaki tekstu tematu zostały zastąpione, proces kończy się na tym.
str_replace : działa w kolejności, w jakiej klucze są zdefiniowane, więc:
- znajduje klucz „PHP” w tekście tematu i zastępuje go: „PHP: Hypertext Preprocessor”, co daje w rezultacie:
„PHP: Hypertext Preprocessor: Hypertext Preprocessor”.
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:
„PHP: Hypertext Preprocessor”.
nie ma już kluczy do poszukiwania, więc wymiana kończy się na tym.
strtrmoże być łatwo odczytany, ponieważstrstrjest zupełnie inny. Zaczynam myśleć, że mam dysleksję. Nie popełnię tego błędu z str_replace.