Comparar variables string.
Resumen.
Entendemos por variables tipo string o cadena aquellas variables que contienen por ejemplo un nombre, una dirección de e-mail, o un texto. Con este tipo de variables no se pueden realizar operaciones matemáticas como la suma, pero si podemos establecer una igualdad o diferencia, e incluso podemos determinar cuan diferente son. Veremos como podemos hacer esto.Artículo.
En los lenguajes de programación podemos encontrar funciones que “hacen lo mismo”, y para algunos casos, puede que sea indiferente el uso de una o de otra, pero eso no quiere decir que las comparaciones se hagan exactamente de la misma manera o que den idéntico resultado. Por tales motivos es conveniente conocer la lógica de funcionamiento de cada una y elegir la función que mejor se acomoda a nuestras necesidades concretas.
Para ilustrar lo que estamos diciendo vamos a tomar tres funciones, o si se quiere cinco (ya que unas permiten la diferenciación entre mayúsculas y minúsculas), usadas para comparar cadenas o string:
La obviedad de esta función está en que sea 0 el valor devuelto. Pero si la función devuelve por ejemplo 2, ¿qué significa?
Si compara las cadenas “abcd” y “ABcd”, cambiando la “AB” a minúsculas, o “ab” a mayúsculas, ya tendríamos dos cadenas idénticas.
Esta función podría ser muy recomendable para comparar valores como las claves.
La función strcasecmp() y su variante strcmp() hace en principio lo mismo, pero como ya decíamos, lo hace de diferente forma. La primera diferencia es que strcasecmp() no diferencia mayúsculas de minúsculas, mientras que strcmp() si lo hace. Otra diferencias es que, si bien la función levenshtein() solo daba como resultado valores iguales o mayores que 0, estas dos funciones también pueden dar valores negativos. Esto nos puede resultar útil cuando recogemos cierto tipo de datos como la numeración de una tarjeta de crédito.
Y llegados a este punto, cerramos este capitulo dedicado a la comparación de cadenas o strings, solo matizar que, si bien una variable que contiene la numeración de una tarjeta de crédito, por poner un ejemplo, aunque solo contenga valores numéricos, se considera string y no numérica, ya que su numeración solo implica diferencia con otras numeraciones, no tiene sentido hablar de una numeración mayor o menor, como tampoco lo tiene sumar la numeración de diferentes tarjetas de crédito.
Para ilustrar lo que estamos diciendo vamos a tomar tres funciones, o si se quiere cinco (ya que unas permiten la diferenciación entre mayúsculas y minúsculas), usadas para comparar cadenas o string:
- levenshtein(): Diferencia entre mayúsculas y minúsculas.
- strcasecmp(): No diferencia entre mayúsculas y minúsculas.
- strcmp(): Diferencia entre mayúsculas y minúsculas.
- stripos(): No diferencia entre mayúsculas y minúsculas.
- strpos(): Diferencia entre mayúsculas y minúsculas.
Antes de continuar, un inciso. Todas las funciones de PHP están listadas y comentadas en la página de PHP, https://www.php.net/, pero a veces los comentarios y explicaciones pueden resultar demasiado complicados para noveles en PHP. Por tal motivo, desde aquí se pretende dar una explicación comprensible para aquel programador que se está iniciando en este lenguaje.Dicho esto, vamos con la primera. La función levenshtein() calcula la igualdad o diferencia entre dos cadenas sobre el número de caracteres que es preciso agregar o modificar para que ambas sean idénticas y considera diferentes mayúsculas y minúsculas. Si dos cadenas son idénticas, dará como resultado cero.
Como tantas y tantas funciones, para un uso práctico de ellas debemos usar una estructura condicional que nos muestra una respuesta u otra en función de las variables analizadas.<?php // Calcula la distancia entre dos variables, 0 si son iguales $var1 = 'abcd'; $var2 = 'abCd'; $devuelve1 = levenshtein($var1, $var2); if($devuelve1 == 0){ // Son iguales echo "<b>$var1</b> y <b>$var2</b> son iguales<br />"; }else{ // NO son iguales echo "<b>$var1</b> y <b>$var2</b> NO son iguales<br />"; } echo "<p>levenshtein: $devuelve1 </p>"; ?>
La obviedad de esta función está en que sea 0 el valor devuelto. Pero si la función devuelve por ejemplo 2, ¿qué significa?
Si compara las cadenas “abcd” y “ABcd”, cambiando la “AB” a minúsculas, o “ab” a mayúsculas, ya tendríamos dos cadenas idénticas.
Esta función podría ser muy recomendable para comparar valores como las claves.
La función strcasecmp() y su variante strcmp() hace en principio lo mismo, pero como ya decíamos, lo hace de diferente forma. La primera diferencia es que strcasecmp() no diferencia mayúsculas de minúsculas, mientras que strcmp() si lo hace. Otra diferencias es que, si bien la función levenshtein() solo daba como resultado valores iguales o mayores que 0, estas dos funciones también pueden dar valores negativos. Esto nos puede resultar útil cuando recogemos cierto tipo de datos como la numeración de una tarjeta de crédito.
En otras ocasiones lo que nos interesa no es una comparación estricta, nuestro interés es saber si una determinada cadena aparece dentro de otra. Para ello usaremos la función stripos() que no diferencia mayúsculas de minúsculas o su complementaria strpos(), que si lo hace.<?php // Establece la diferencia entre dos variables, 0 si son iguales $tarjeta1 = '4321654398765432'; $tarjeta2 = '43216543987654329'; // strcmp -- diferencia entre mayusculas y minusculas // strcasecmp -- NO diferencia entre mayusculas y minusculas $devuelve2 = strcasecmp($tarjeta1, $tarjeta2); switch($devuelve2){ case $devuelve2 < 0: $resultado = "<p>Hay $devuelve2 digito de menos en tu tarjeta<br /> $tarjeta1 es menor que $tarjeta2</p>"; break; case $devuelve2 == 0: $resultado = "<p>Los numeros de tarjeta coinciden<br /> $tarjeta1 y $tarjeta2 son iguales</p>"; break; case $devuelve2 > 0: $resultado = "<p>Hay $devuelve2 digito de mas en tu tarjeta<br /> $tarjeta1 es mayor que $tarjeta2</p>"; break; default: $resultado = null; break; } echo $resultado; ?>
Esta función nos da la posición de la primera ocurrencia de la cadena buscada en la cadena donde se realiza la búsqueda. Así podemos saber si una dirección de e-mail pertenece o no a Google. Si modificamos la variable $busca, a $busca = '@';, podemos saber si existe una dirección de e-mail, aunque claro, esto no puede tomarse como una validación en cuanto tal. Esta función, así expresada podría sernos útil para saber si un usuario pretende identificarse con su nombre de usuario o su dirección de e-mail.<?php // Buscamos una cadena dentro de otra. $email = 'mi-email@gmail.com'; $busca = 'Gmail'; // strpos -- distingue mayusculas y minusculas // stripos -- NO distingue mayusculas y minusculas $devuelve3 = stripos($email, $busca); // Podemos hacer la comparacion con TRUE o FALSE y los comparadores === y !== if ($devuelve3 === TRUE) { echo "NO existe <b>$busca</b>."; } else { echo "Existe <b>$busca</b> en la posicion: $devuelve3"; }
?>
Y llegados a este punto, cerramos este capitulo dedicado a la comparación de cadenas o strings, solo matizar que, si bien una variable que contiene la numeración de una tarjeta de crédito, por poner un ejemplo, aunque solo contenga valores numéricos, se considera string y no numérica, ya que su numeración solo implica diferencia con otras numeraciones, no tiene sentido hablar de una numeración mayor o menor, como tampoco lo tiene sumar la numeración de diferentes tarjetas de crédito.
Tags: Comparación || levenshtein || strcasecmp || strcmp || stripos || strpos || cadenas || string