Pierwsza różnica:
Ciekawy przykład innego zachowania między strtr
i str_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);
?>
- 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_replace
jest to bardziej globalne podejście do zastępowania, podczas gdy strtr
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:
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.
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.