İlk fark:
PHP Kılavuzunun yorumlar bölümünde strtr
ve 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 , karakterleri tek tek çevirirken, str_replace
değ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:
- 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.
- 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:
- konu metninde "PHP" anahtarını bulur ve şu şekilde değiştirir: "PHP: Hypertext Preprocessor", sonuç olarak:
"PHP: Hypertext Preprocessor: Hypertext Preprocessor".
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".
Aranacak başka anahtar yok, bu nedenle değiştirme burada bitiyor.
strtr
kolayca yanlış okunabilirstrstr
. Disleksik olduğumu düşünmeye başlıyorum. Str_replace ile bu hatayı yapmayacaksınız.