2011-11-18 35 views
65

Tôi gặp khó khăn khi hiểu khi strtr thích hợp hơn là str_replace hoặc ngược lại. Dường như có thể đạt được kết quả chính xác giống nhau bằng cách sử dụng một trong hai hàm, mặc dù thứ tự mà các phần tử được thay thế được đảo ngược. Ví dụ:Khi nào nên sử dụng strtr vs str_replace?

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'); 

này kết quả đầu ra

YeXY XYring 
YeZ Zring 
YeXY XYring 
YeZ Zring 

Bên cạnh cú pháp, là có bất kỳ lợi ích để sử dụng một trong khác không? Bất kỳ trường hợp nào không đủ để đạt được kết quả mong muốn?

+3

Từ quan điểm dễ đọc, 'strtr' có thể dễ dàng bị đọc sai là' strstr', điều này hoàn toàn khác. Tôi bắt đầu nghĩ rằng tôi mắc chứng khó đọc. Sẽ không phạm sai lầm đó với str_replace. – Programster

Trả lời

104

Đầu tiên chênh lệch:

Một ví dụ thú vị về một hành vi khác nhau giữa strtrstr_replace là trong phần ý kiến ​​của Manual 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 chờ kết quả : "ZDDB"
  • Tuy nhiên, lợi tức này: "ZDDD" (Becaus e B = D theo mảng của chúng tôi)

Để thực hiện việc này, sử dụng "strtr" thay vì:

<?php 
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); 
$word = "ZBB2"; 
echo strtr($word,$arr); 
?> 
  • này trả về: "ZDDB"

Điều này có nghĩa rằng 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 điểm khác biệt:

Với đoạn mã sau (lấy từ PHP String Replacement Speed Comparison):

<?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 đường dẫn của văn bản sẽ là:

chuỗi (3) "PHP"
chuỗi (27) "PHP: Hypertext Preprocessor"


Lời giải thích chính:

Điều này xảy ra bởi vì:

  • strtr: nó loại thông số của nó theo chiều dài, thứ tự giảm dần , như vậy:

    1. nó sẽ cung cấp cho "tầm quan trọng" lớn nhất, và sau đó, như là văn bản chủ đề chính nó là chìa khóa lớn nhất của mảng thay thế, nó được dịch.
    2. 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 phím được định nghĩa, vì vậy:

    1. nó tìm thấy chìa khóa “PHP” trong văn bản đề và thay thế nó bằng: “PHP: Hypertext Preprocessor ”, Kết quả là:

      “ PHP: Trình xử lý trước siêu văn bản: Trình xử lý trước siêu văn bản ”.

    2. sau đó nó tìm thấy chìa khóa tiếp theo: “PHP: Hypertext Preprocessor” trong văn bản kết quả của bước cựu, vì vậy nó được thay thế bằng "PHP", mang đến cho kết quả:

      “ PHP: Hypertext Preprocessor ”.

    3. không còn phím nào để tìm kiếm, vì vậy, thay thế sẽ kết thúc tại đó.

+1

Ah ok cảm ơn! Tôi đã không nhận ra strtr được dịch theo chiều dài - tôi nghĩ nó theo thứ tự ngược lại. – andrewtweber

+0

Như được ghi trong php.net hàm str_replace có thêm 1 tham số có tên là "count" để cho biết số lần thay thế sẽ thực hiện. Nhưng tôi không thể sử dụng tham số này. Có ai biết tại sao không ? –

+1

@ vantrung-cuncon Đó không phải là tham số của nó. Các tài liệu nói: "Điều này sẽ được đặt thành số thay thế được thực hiện". Bạn sẽ cần phải tìm một giải pháp khác nếu bạn muốn giới hạn str_replace với một số lượng thay thế nhất định. – jdhartley

14

Dường như nó có thể đạt được kết quả chính xác cùng sử dụng một trong hai chức năng

Đó không phải là luôn luôn đúng và phụ thuộc vào việc tìm kiếm và thay thế dữ liệu bạn cung cấp. Ví dụ, nơi hai chức năng khác nhau xem: Does PHP str_replace have a greater than 13 character limit?

  • strtr sẽ không thay thế trong các bộ phận của chuỗi đó đã đã được thay thế - str_replace sẽ thay thế bên trong thay thế.
  • strtr sẽ bắt đầu bằng khóa dài nhất đầu tiên trong trường hợp bạn gọi bằng hai tham số - str_replace sẽ thay thế từ trái sang phải.
  • str_replace có thể trả lại số lần thay thế được thực hiện - strtr không cung cấp giá trị tính như vậy.
4

Tôi nghĩ strtr cung cấp thay thế linh hoạt hơn và có điều kiện khi sử dụng với hai đối số, ví dụ: nếu chuỗi là 1, thay thế với một, nhưng nếu chuỗi là 10, thay thế với b. Thủ thuật này chỉ có thể đạt được bằng cách strtr.

$string = "1.10.0001"; 
echo strtr($string, array("1" => "a", "10" => "b")); 
// a.b.000a 

xem: Php Manual Strtr.

1

Thông báo trong sổ tay STRTR-- Mô tả chuỗi strtr (string $ str, string $ từ, chuỗi $ đến) chuỗi strtr (string $ str, mảng $ replace_pairs) Nếu cho ba đối số, chức năng này trở lại một bản sao của str nơi ...

STR_REPLACE-- ... Nếu tìm kiếm hoặc thay thế là mảng, các yếu tố của họ được xử lý đầu đến cuối. ...

STRTR mỗi lượt không có hiệu lực cho lần tiếp theo, NHƯNG STR_REPLACE thực hiện.

Các vấn đề liên quan