strtr()
La función strtr() en PHP traduce subcadenas dentro de un string. Aprende su sintaxis, comportamiento de paso único y uso práctico.
Introducción
La función strtr() en PHP traduce subcadenas dentro de un string. Es especialmente útil para el procesamiento de texto cuando se necesitan reemplazar secuencias específicas de manera eficiente. Este artículo cubre su sintaxis, comportamiento y uso práctico.
Comprender la función strtr()
La función strtr() admite dos firmas:
Firma con array
strtr(string $str, array $replace) : stringAquí, $str es el string de entrada y $replace es un array asociativo que asigna subcadenas a sus reemplazos. La función reemplaza todas las ocurrencias de las claves con sus valores correspondientes.
Firma con tres argumentos
strtr(string $str, string $from, string $to) : stringEn esta forma, $from y $to deben tener la misma longitud. Cada carácter en $from se asigna al carácter en la misma posición en $to.
Comportamiento importante: strtr() reemplaza subcadenas usando un algoritmo de coincidencia más larga primero. Esto significa que los patrones superpuestos se resuelven priorizando la coincidencia más larga, y los reemplazos no se aplican de forma recursiva a la salida.
Forma con array: reemplazar subcadenas
El uso más común de strtr() es la forma con dos argumentos y array. Se pasa un array asociativo que asigna cada subcadena a encontrar con el valor por el que debe ser reemplazada.
Aquí strtr() reemplaza cada "H" con "J" y cada "W" con "Z". Las claves pueden tener cualquier longitud, por lo que puedes asignar palabras completas tan fácilmente como caracteres individuales:
<?php
$string = "The quick brown fox";
echo strtr($string, ["quick" => "slow", "brown" => "red"]);
// Output: The slow red foxLos reemplazos se aplican en un solo paso
Este es el comportamiento que confunde a la gente. strtr() recorre el string una vez y nunca vuelve a examinar el texto que ya ha reemplazado. Por lo tanto, un valor que se inserta no volverá a ser comparado con otra regla:
<?php
echo strtr("Hi all, I said hello", ["Hi" => "Hello", "hello" => "hi"]);
// Output: Hello all, I said hiEl "Hi" se convierte en "Hello", pero ese nuevo "Hello" no es luego convertido en "hi" por la segunda regla — el reemplazo no es recursivo. Esto hace que strtr() sea seguro para intercambiar dos valores a la vez (por ejemplo "yes" <-> "no"), algo que str_replace() no puede hacer en una sola llamada.
La coincidencia más larga gana
Cuando dos claves podrían coincidir en la misma posición, strtr() siempre prefiere la más larga:
<?php
echo strtr("a b c", ["a b" => "X", "a" => "Y"]);
// Output: X cAunque "a" aparece primero en el array, la clave más larga "a b" coincide en esa posición y tiene prioridad. El orden del array no importa — solo importa la longitud de la clave.
Forma con tres argumentos: traducción carácter por carácter
La forma con tres argumentos asigna caracteres individuales. $from y $to deben tener la misma longitud; cada carácter en $from es reemplazado por el carácter en la misma posición en $to.
<?php
echo strtr("Hello World", "lo", "LO");
// Output: HeLLO WOrLdCada l se convierte en L y cada o se convierte en O. Si $from es más largo que $to, los caracteres extra se ignoran. Esta forma es útil para intercambios simples tipo cifrado o normalización de caracteres, pero solo puede reemplazar caracteres individuales — usa la forma con array cuando necesites reemplazar subcadenas de varios caracteres.
strtr() vs str_replace()
Ambas funciones reemplazan texto, pero se comportan de manera diferente:
strtr()trabaja en un único paso no recursivo y resuelve conflictos por coincidencia más larga. El texto reemplazado nunca se vuelve a examinar.str_replace()aplica sus reglas de forma secuencial, por lo que un reemplazo anterior puede volver a ser coincidido por uno posterior. También distingue entre mayúsculas y minúsculas (usastr_ireplace()para reemplazo sin distinción de mayúsculas).
Usa strtr() cuando tengas un mapa fijo de intercambios que deben ocurrir exactamente una vez — escapado, transliteración o intercambios bidireccionales. Para reemplazos basados en patrones, usa preg_replace() en su lugar.
Conclusión
La función strtr() proporciona una forma eficiente de traducir subcadenas en PHP. Admite tanto la asignación basada en arrays como la traducción carácter por carácter mediante la forma con tres argumentos. Dado que opera en un único paso usando la lógica de coincidencia más larga primero, es muy adecuada para intercambios de una sola vez y a menudo es más rápida que llamadas encadenadas a str_replace(). Comprender las reglas de paso único y coincidencia más larga te ayuda a elegir la herramienta correcta para cada tarea de procesamiento de texto.