Erster Unterschied:
Ein interessantes Beispiel für ein anderes Verhalten zwischen strtr
und finden Sie str_replace
im Kommentarbereich des PHP-Handbuchs:
<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
- Ich würde als Ergebnis erwarten: "ZDDB"
- Diese Rückgabe lautet jedoch: "ZDDD" (weil B = D gemäß unserem Array)
Verwenden Sie stattdessen "strtr", damit dies funktioniert:
<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
Dies bedeutet, dass dies str_replace
ein globalerer Ansatz für das Ersetzen ist, während strtr
die Zeichen einfach einzeln übersetzt werden.
Ein weiterer Unterschied:
Angesichts des folgenden Codes (entnommen aus dem 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);
?>
Die resultierenden Textzeilen sind:
Zeichenfolge (3) "PHP"
Zeichenfolge (27) "PHP: Hypertext Preprocessor"
Die Haupterklärung:
Dies geschieht, weil:
strtr : sortiert seine Parameter nach Länge in absteigender Reihenfolge, also:
- es wird dem größten "mehr Bedeutung" geben, und dann wird es übersetzt, da der Betreff selbst der größte Schlüssel des Ersatzarrays ist.
- Da alle Zeichen des Betreffs ersetzt wurden, endet der Vorgang dort.
str_replace : Es funktioniert in der Reihenfolge, in der die Schlüssel definiert sind.
- es findet den Schlüssel "PHP" im Betreff und ersetzt ihn durch: "PHP: Hypertext Preprocessor", was als Ergebnis ergibt:
"PHP: Hypertext-Präprozessor: Hypertext-Präprozessor".
dann findet es den nächsten Schlüssel: "PHP: Hypertext Preprocessor" im resultierenden Text des vorherigen Schritts, so dass es durch "PHP" ersetzt wird, was als Ergebnis ergibt:
"PHP: Hypertext Preprocessor".
Es sind keine Schlüssel mehr zu suchen, daher endet der Austausch dort.
strtr
dies leicht falsch verstanden werden, dastrstr
dies ganz anders ist. Ich fange an zu glauben, ich sei Legastheniker. Ich werde diesen Fehler nicht mit str_replace machen.