Erster Unterschied:
Ein interessantes Beispiel für ein anderes Verhalten zwischen strtrund finden Sie str_replaceim 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_replaceein globalerer Ansatz für das Ersetzen ist, während strtrdie 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.
strtrdies leicht falsch verstanden werden, dastrstrdies ganz anders ist. Ich fange an zu glauben, ich sei Legastheniker. Ich werde diesen Fehler nicht mit str_replace machen.