maettig.com

Thiemos Archiv

Gibt es einen Unterschied zwischen den folgenden zwei Zeilen?
$str = str_replace(array("a", "b"), array("b", "c"), $str);
$str = strtr($str, array("a" => "b", "b" => "c"));
Man sollte denken, es gibt keinen. Falsch.

Der Unterschied ist klein, hat im obigen Beispiel aber gewaltige Auswirkungen. str_replace() ersetzt zuerst alle »a« durch »b«, und dann alle »b« durch »c«. Es wendet eine Regel nach der anderen auf den kompletten String an. Im Beispiel bleibt also kein »b« übrig, weil die zweite Regel die schon gemachten Ersetzungen der ersten Regel noch einmal ersetzt. Die Wirkung ist also identisch mit:
$str = str_replace("a", "b", $str);
$str = str_replace("b", "c", $str);

Im Gegensatz dazu wendet strtr() seine Regeln parallel an, während es den String nur ein einziges Mal durchläuft. Die durch die erste Regel entstandenen »b« werden durch die zweite Regel also nicht wieder zerstört.

Das entspricht genau dem Verhalten von z.B. stripslashes() und ist auch für Dinge wie selbstgebaute undo_htmlspecialchars() wichtig. In solchen Fällen sollte man nie str_replace() verwenden, es sei denn, man ist sich über den kumulierenden Effekt im Klaren.

Kommentare zu diesem Beitrag können per E-Mail an den Autor gesandt werden.

[ ← Zurück zur Übersicht ]

Impressum & Datenschutz