Điểm khác biệt đầu tiên:
Một ví dụ thú vị về một hành vi khác nhau giữa strtr
và str_replace
nằm trong phần nhận xét của Hướng dẫn sử dụng PHP:
<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
- Tôi mong đợi kết quả là: "ZDDB"
- Tuy nhiên, trả về này: "ZDDD" (Vì B = D theo mảng của chúng ta)
Để làm cho việc này hoạt động, hãy sử dụng "strtr" thay thế:
<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
Điều này có nghĩa là đó str_replace
là một cách tiếp cận toàn cầu hơn để thay thế, trong khi strtr
chỉ cần dịch từng ký tự một.
Một sự khác biệt khác:
Cho đoạn mã sau (lấy từ So sánh tốc độ thay thế chuỗi 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);
?>
Các dòng văn bản kết quả sẽ là:
string (3) "PHP"
string (27) "PHP: Hypertext Preprocessor"
Lời giải thích chính:
Điều này xảy ra bởi vì:
strtr : nó sắp xếp các tham số của nó theo độ dài, theo thứ tự giảm dần, vì vậy:
- nó sẽ cung cấp "tầm quan trọng hơn" cho cái lớn nhất, và sau đó, vì bản thân văn bản chủ đề là khóa lớn nhất của mảng thay thế, nó sẽ được dịch.
- bởi vì tất cả các ký tự của văn bản chủ đề đã được thay thế, quá trình kết thúc ở đó.
str_replace : nó hoạt động theo thứ tự các khóa được xác định, vì vậy:
- nó tìm thấy khóa “PHP” trong văn bản chủ đề và thay thế nó bằng: “PHP: Hypertext Preprocessor”, kết quả là:
“PHP: Hypertext Preprocessor: Bộ tiền xử lý siêu văn bản”.
sau đó nó tìm thấy khóa tiếp theo: “PHP: Hypertext Preprocessor” trong văn bản kết quả của bước trước đó, vì vậy nó được thay thế bằng "PHP", kết quả là:
“PHP: Bộ tiền xử lý siêu văn bản”.
không còn chìa khóa để tìm kiếm nữa, vì vậy việc thay thế kết thúc ở đó.
strtr
có thể dễ dàng bị đọc nhầm vìstrstr
nó khá khác biệt. Tôi bắt đầu nghĩ rằng tôi mắc chứng khó đọc. Sẽ không mắc lỗi đó với str_replace.