soundex()
Artículo sobre la función PHP soundex(), utilizada para calcular la clave Soundex de una cadena, útil para comparar pronunciaciones.
La función PHP soundex() calcula la clave Soundex de una cadena — un código corto que representa cómo suena la cadena en inglés en lugar de cómo se escribe. Dos palabras que se escriben de forma diferente pero se pronuncian de manera similar (como "Smith" y "Smyth") producen la misma clave, lo que hace que Soundex sea útil para la búsqueda difusa de nombres, sugerencias de corrección ortográfica y la deduplicación de listas de contactos.
Esta página cubre la sintaxis de soundex(), el formato de la clave que devuelve, cómo funciona el algoritmo y ejemplos prácticos — incluyendo sus limitaciones y cómo se compara con funciones relacionadas.
Sintaxis
soundex(string $string): stringToma un parámetro:
$string— la cadena de entrada a codificar. Solo se consideran los caracteres alfabéticos; los dígitos, espacios y signos de puntuación se ignoran.
Devuelve la clave Soundex como una cadena. Para entradas alfabéticas no vacías, la clave siempre tiene 4 caracteres: una letra mayúscula seguida de tres dígitos (por ejemplo, H464). Si la entrada no contiene letras, soundex() devuelve una cadena vacía.
Cómo se construye la clave Soundex
El algoritmo Soundex reduce una palabra a su primera letra más un código de tres dígitos basado en los sonidos consonánticos restantes:
-
Se conserva la primera letra de la palabra.
-
Las letras restantes se asignan a dígitos, agrupando las consonantes que suenan igual:
Letras Dígito b, f, p, v 1 c, g, j, k, q, s, x, z 2 d, t 3 l 4 m, n 5 r 6 -
Las vocales
a, e, i, o, uy las letrash, w, yse eliminan (no se les asigna un dígito). -
Los dígitos duplicados adyacentes se reducen a uno solo.
-
El resultado se rellena con ceros (o se trunca) hasta tener exactamente cuatro caracteres.
Por eso soundex('Robert') y soundex('Rupert') producen ambas R163 — las vocales diferentes se ignoran.
Ejemplo básico
Aquí la cadena $string se codifica con soundex(). La salida es:
H464La H es la primera letra, y 464 codifica los sonidos consonánticos l (4), r (6), l (4). El espacio y el límite de palabra se ignoran — Soundex trata la entrada como una secuencia continua de letras.
Comparar dos cadenas
El uso más común de soundex() es comprobar si dos palabras suenan igual comparando sus claves:
Dado que Smith y Smyth se codifican ambas como S530, sus claves coinciden y la salida es:
The strings sound the same.Buscar un nombre en una lista
Un patrón práctico es sugerir candidatos de "¿quisiste decir...?" a partir de una lista conocida cuando falla una coincidencia exacta:
<?php
$names = ['Robert', 'Rupert', 'Rubin', 'Albert'];
$query = 'Ruppert';
$queryKey = soundex($query);
foreach ($names as $name) {
if (soundex($name) === $queryKey) {
echo "$name sounds like $query\n";
}
}
?>Tanto Robert como Rupert comparten la clave R163 con Ruppert, por lo que la salida es:
Robert sounds like Ruppert
Rupert sounds like RuppertLimitaciones
- Centrado en el inglés. La asignación de letra a dígito está ajustada para la pronunciación inglesa, por lo que funciona mal con nombres de otros idiomas.
- La primera letra debe coincidir. Dado que Soundex siempre conserva la primera letra,
Kris(K620) yChris(C620) no coinciden, aunque se pronuncien de forma idéntica. - Coincidencia aproximada. Solo sobreviven los primeros sonidos consonánticos, por lo que palabras largas muy diferentes pueden coincidir en la misma clave. Úsalo como un filtro de primera pasada, no como una respuesta definitiva.
Para un algoritmo fonético diferente que suele manejar mejor el inglés, consulta metaphone(). Para medir qué tan similares son dos cadenas en lugar de si suenan igual, consulta similar-text() y levenshtein().