Kapan menggunakan strtr vs str_replace?

87

Saya mengalami kesulitan memahami kapan strtrlebih baik str_replaceatau sebaliknya. Tampaknya dimungkinkan untuk mencapai hasil yang sama persis menggunakan salah satu fungsi, meskipun urutan penggantian substring dibalik. Sebagai contoh:

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

Output ini

YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring

Selain sintaks, apakah ada manfaat menggunakan salah satu dari yang lain? Adakah kasus di mana seseorang tidak akan cukup untuk mencapai hasil yang diinginkan?

andrewtweber
sumber
3
Dari sudut pandang keterbacaan, strtrdapat dengan mudah salah dibaca karena strstrsangat berbeda. Saya mulai berpikir saya disleksia. Tidak akan membuat kesalahan itu dengan str_replace.
Programster

Jawaban:

136

Perbedaan pertama:

Contoh menarik dari perilaku berbeda antara strtrdan str_replaceada di bagian komentar di Manual PHP:

<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
  • Saya mengharapkan hasil: "ZDDB"
  • Namun, ini mengembalikan: "ZDDD" (Karena B = D menurut array kita)

Untuk membuat ini berfungsi, gunakan "strtr" sebagai gantinya:

<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
  • Ini mengembalikan: "ZDDB"

Ini berarti str_replacependekatan yang lebih global untuk penggantian, sementara strtrhanya menerjemahkan karakter satu per satu.


Perbedaan lainnya:

Diberikan kode berikut (diambil dari Perbandingan Kecepatan Penggantian String 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);
?>

Baris teks yang dihasilkan adalah:

string (3) "PHP"
string (27) "PHP: Hypertext Preprocessor"


Penjelasan utama:

Ini terjadi karena:

  • strtr : itu mengurutkan parameternya berdasarkan panjang, dalam urutan menurun, jadi:

    1. itu akan memberikan "lebih penting" ke yang terbesar, dan kemudian, karena teks subjek itu sendiri adalah kunci terbesar dari larik pengganti, itu akan diterjemahkan.
    2. karena semua karakter teks subjek telah diganti, prosesnya berakhir di situ.
  • str_replace : ini berfungsi dalam urutan kunci ditentukan, jadi:

    1. ia menemukan kunci "PHP" dalam teks subjek dan menggantinya dengan: "PHP: Hypertext Preprocessor", yang memberikan hasil:

      “PHP: Hypertext Preprocessor: Hypertext Preprocessor”.

    2. kemudian ia menemukan kunci berikutnya: "PHP: Hypertext Preprocessor" dalam teks yang dihasilkan dari langkah sebelumnya, sehingga akan diganti dengan "PHP", yang menghasilkan:

      “PHP: Hypertext Preprocessor”.

    3. tidak ada lagi kunci yang harus dicari, jadi penggantinya berakhir di situ.

Nicolás Ozimica
sumber
2
Ah ok terima kasih! Saya tidak menyadari strtr menerjemahkan panjangnya - saya pikir itu dalam urutan terbalik.
andrewtweber
Seperti yang didokumentasikan di php.net, fungsi str_replace memiliki 1 parameter lagi bernama "count" untuk menunjukkan berapa kali penggantian harus dilakukan. Tetapi saya tidak dapat menggunakan parameter ini. Ada yang tahu kenapa?
vantrung -cuncon
2
@ vantrung-cuncon Bukan untuk itu parameter itu. Dokumen mengatakan: "Ini akan disetel ke jumlah penggantian yang dilakukan." Anda perlu mencari solusi lain jika Anda ingin membatasi str_replace ke jumlah penggantian tertentu.
jdhartley
1
Membatasi jumlah penggantian mungkin berguna jika Anda ingin mengganti kemunculan pertama akronim menjadi versi diperpanjang, yaitu mengubah kemunculan pertama "WHO" menjadi "WHO (Organisasi Kesehatan Dunia)".
Michał Tatarynowicz
1
strtrtidak akan menggantikan teks yang disisipkan oleh penggantian sebelumnya. strtr('foo', array('oo' => 'ie', 'e' => 't'))kembali 'fie'daripada 'fit'seperti str_replacehalnya. Oleh karena itu, secara otomatis mengatasi masalah yang diangkat oleh @Pies.
David Harkness
21

Tampaknya dimungkinkan untuk mencapai hasil yang sama persis menggunakan salah satu fungsi

Itu tidak selalu benar dan tergantung pada pencarian dan penggantian data yang Anda berikan. Misalnya di mana dua fungsi berbeda lihat: Apakah PHP str_replace memiliki batas lebih dari 13 karakter?

  • strtrtidak akan menggantikan bagian dari string yang telah diganti - str_replaceakan menggantikan dalam menggantikan.
  • strtrakan mulai dengan kunci terpanjang terlebih dahulu jika Anda memanggilnya dengan dua parameter - str_replaceakan mengganti dari kiri ke kanan.
  • str_replacedapat mengembalikan jumlah penggantian yang dilakukan - strtrtidak menawarkan nilai hitungan seperti itu.
hakre
sumber
7

Saya rasa strtrmemberikan penggantian yang lebih fleksibel dan bersyarat jika digunakan dengan dua argumen, misalnya: jika string 1, ganti dengan a, tetapi jika string 10, ganti dengan b. Trik ini hanya bisa dicapai oleh strtr.

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

lihat: Php Manual Strtr .

Arif RH
sumber
2

Pemberitahuan di STRTR manual-- Deskripsi string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Jika diberi tiga argumen, fungsi ini mengembalikan salinan str di mana ...

STR_REPLACE-- ... Jika pencarian atau penggantian adalah array, elemennya akan diproses terlebih dahulu hingga terakhir . ...

STRTR setiap belokan TIDAK berpengaruh ke berikutnya, TAPI STR_REPLACE melakukannya.

Null Tidak Ada
sumber