Strtr ve str_replace ne zaman kullanılır?


87

Ne zaman strtrtercih edileceğini str_replaceya da tam tersini anlamakta zorlanıyorum . Alt dizelerin değiştirilme sırası tersine dönse de, her iki işlevi kullanarak da aynı sonuçları elde etmek mümkün görünüyor. Örneğin:

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

Bu çıktılar

YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring

Sözdizimi dışında, birini diğerinin üzerinde kullanmanın herhangi bir faydası var mı? İstenilen bir sonuca ulaşmak için yeterli olmayacağı herhangi bir durum var mı?


3
Okunabilirlik açısından bakıldığında, hangisi oldukça farklı olduğu için strtrkolayca yanlış okunabilir strstr. Disleksik olduğumu düşünmeye başlıyorum. Str_replace ile bu hatayı yapmayacaksınız.
Programster

Yanıtlar:


136

İlk fark:

PHP Kılavuzunun yorumlar bölümünde strtrve arasındaki farklı davranışlara ilginç bir örnek str_replace:

<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
  • Sonuç olarak bekliyorum: "ZDDB"
  • Ancak bu dönüş: "ZDDD" (Çünkü dizimize göre B = D)

Bunun çalışması için bunun yerine "strtr" kullanın:

<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
  • Bu şunu döndürür: "ZDDB"

Bu , karakterleri tek tek çevirirken, str_replacedeğiştirmelere daha genel bir yaklaşım olduğu anlamına gelir strtr.


Başka bir farklılık:

Aşağıdaki kod göz önüne alındığında ( PHP Dize Değiştirme Hızı Karşılaştırmasından alınmıştır ):

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

Ortaya çıkan metin satırları şöyle olacaktır:

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


Ana açıklama:

Bunun nedeni:

  • strtr : parametrelerini uzunluğa göre azalan sırada sıralar, böylece:

    1. en büyüğüne "daha fazla önem" verecek ve sonra konu metninin kendisi değiştirilen dizinin en büyük anahtarı olduğu için çevrilir.
    2. konu metninin tüm karakterleri değiştirildiği için süreç burada biter.
  • str_replace : anahtarların tanımlanma sırasına göre çalışır, yani:

    1. konu metninde "PHP" anahtarını bulur ve şu şekilde değiştirir: "PHP: Hypertext Preprocessor", sonuç olarak:

      "PHP: Hypertext Preprocessor: Hypertext Preprocessor".

    2. daha sonra, önceki adımın sonuç metninde bir sonraki anahtarı bulur: "PHP: Hypertext Preprocessor", böylece "PHP" ile değiştirilir ve sonuç olarak:

      "PHP: Hypertext Preprocessor".

    3. Aranacak başka anahtar yok, bu nedenle değiştirme burada bitiyor.


2
Ah tamam teşekkürler! Strtr'nin uzunluğa göre çeviri yaptığını bilmiyordum - ters sırada olduğunu düşündüm.
andrewtweber

Php.net'te belgelendiği gibi, str_replace işlevi, değiştirmenin kaç kez gerçekleştirilmesi gerektiğini belirtmek için "count" adlı 1 tane daha parametreye sahiptir. Ama yine de bu parametreyi kullanamıyorum. Nedenini bilen var mı?
vantrung -cuncon

2
@ vantrung-cuncon Bu parametre bunun için değil. Dokümanlar şunu söylüyor: "Bu, gerçekleştirilen değiştirme sayısına ayarlanacaktır." Str_replace'i belirli sayıda değiştirme ile sınırlamak istiyorsanız başka bir çözüm bulmanız gerekecektir.
jdhartley

1
Bir kısaltmanın ilk geçtiği yeri genişletilmiş versiyonla değiştirmek istiyorsanız, yani "WHO" nun ilk geçtiği yeri "WHO (Dünya Sağlık Örgütü)" olarak değiştirmek istiyorsanız, değiştirme sayısını sınırlandırmak faydalı olabilir.
Michał Tatarynowicz

1
strtrönceki değiştirmelerle eklenen metni değiştirmez. olduğu gibi değil strtr('foo', array('oo' => 'ie', 'e' => 't'))döner . Böylelikle @ Pies tarafından gündeme getirilen sorunu otomatik olarak ele alır. 'fie''fit'str_replace
David Harkness

21

Her iki işlevi kullanarak da aynı sonuçları elde etmek mümkün görünüyor

Bu her zaman doğru değildir ve sağladığınız arama ve değiştirme verilerine bağlıdır. Örneğin, iki işlevin farklı olduğu yerlerde bkz: PHP str_replace, 13 karakterden büyük bir sınıra mı sahip?

  • strtrdizenin halihazırda değiştirilmiş kısımlarında değiştirilmeyecek - str_replaceyerine değiştirilecektir.
  • strtriki parametre ile çağırmanız durumunda ilk önce en uzun tuşla başlayacak - str_replacesoldan sağa değiştirilecektir.
  • str_replaceyapılan değişikliklerin sayısını döndürebilir - strtrböyle bir sayı değeri sunmaz.

7

Bence strtriki bağımsız değişkenle kullanıldığında daha esnek ve koşullu değiştirme sağlar, örneğin: dizge 1 ise a ile değiştirin, ancak dizge 10 ise b ile değiştirin. Bu numara ancak ile başarılabilirdi strtr.

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

bkz: Php Kılavuzu Strtr .


2

Manuel STRTR'de uyarı - Açıklama string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Eğer üç argüman verilirse, bu fonksiyon str'nin bir kopyasını döndürür burada ...

STR_REPLACE-- ... Eğer arama veya değiştirme diziyse, elemanları önce sondan başlayarak işlenir . ...

STRTR her dönüş bir sonrakine ETKİLMEZ, ANCAK STR_REPLACE etki eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.