Curso de PHP – Clase 9 – Resolución de ejercicios propuestos

En esta nueva entrega, voy a mostrar la resolución de los ejercicios propuestos en la clase anterior del curso básico de PHP. Por cuestión de espacio no voy a volver a incluir los enunciados aquí, así que los pueden encontrar al final del artículo de la clase pasada. Por cada ejercicio, encontrarán enlaces al código fuente y al programa funcionando.

Habíamos visto el tema de strings así que todos los ejercicios están relacionados a las cadenas de caracteres, aunque lógicamente los temas que van apareciendo en las distintas clases se van acumulando.

Empecemos ya mismo con los ejercicios.

Ejercicio 1

Código fuente / Programa funcionando

La idea de este ejercicio es utilizar un string como si fuera un array, tal como vimos en la clase teórica. Primero, vamos a definir una cadena de caracteres para poder trabajar con ella y luego vamos a utilizar una variable por cada vocal. A cada una de estas variables la vamos a inicializar en cero.

Lo que vamos a hacer a continuación es recorrer el string $texto caracter por caracter. En cada pasada que hagamos vamos a comparar el caracter seleccionado con cada una de las vocales. Si coincide, entonces incrementaremos el valor de la variable que corresponde a esa vocal.

Como tenemos que comparar un caracter con distintos valores, es preferible utilizar una estructura condicional del tipo switch / case.

La recorrida caracter por caracter se realiza con un bucle for que cuenta desde el número 0 hasta la longitud del string menos uno. Recuerden strlen devuelve la cantidad de caracteres que compone un string y que se empieza a contar desde 0. Por lo tanto, una cadena de caracteres que llega hasta la posición 10, tendrá una longitud de 11. No queremos que el índice se pase de 10, por lo tanto, le restamos esa unidad.

En el switch, lo que queremos verificar es $texto[$cont]. Es decir, el caracter del string $texto, que corresponde al número de pasada, que lo indica $cont. Luego, por cada vocal, se incrementa la variable que corresponde en uno, utilizando el operador ++. No olviden poner los break.

En este ejercicio no tuve en cuenta las mayúsculas, pero se podría haber hecho también agregando dos case seguidos, de la siguiente manera (muestro solo para la letra a y la e).

Si quieren hacer este ejercicio más interesante, pueden agregar un formulario con un campo de texto donde se pueda incluir cualquier string, para poder contar las vocales.

Ejercicio 2

Código fuente / Programa funcionando

La validación de datos es seguramente el uso más común de los strings. En este caso tenemos que validar un nombre de usuario. El ejercicio nos dice que no puede tener menos de 8 caracteres (8 es aceptable) y tampoco más de 12 (pero 12 sí). Además, no puede empezar con un número, lo que quiere decir, en otras palabras, que el primer caracter no puede ser numérico.

Como es una validación, vamos a implementar una forma que suele ser útil para estos casos. En algún punto del programa vamos a tener que informar si la cadena de caracteres es válida o inválida. Por lo tanto, lo que vamos a hacer es definir al principio del programa una variable booleana con el valor TRUE, luego, haremos las verificaciones que nos pide el ejercicio. Si alguna falla, entonces pasaremos el valor a FALSE. Si ninguna falla, no haremos nada y al final del programa el valor seguirá siendo TRUE y eso indicará que la validación se pasó exitosamente.

Por supuesto, también vamos a definir un string de prueba y además, otro con los caracteres numéricos, ya vamos a ver para qué.

Las primeras tres líneas son

Luego, lo primero que podremos hacer es chequear si la longitud del string es válida. Sabemos que tiene que estar entre 8 y 12 caracteres. Veamos si es así.

Si utilizamos un if con un or, entonces debemos chequear si la longitud es menor que 8 o si es mayor que 12. En cualquiera de los dos casos, la proposición será verdadera y por lo tanto $val pasará a valer FALSE.

Pero si usamos un and, entonces debemos invertir las condiciones y negar por completo la proposición.

Este if funciona exactamente igual que el anterior. Más que programación, yo diría que esto es pura lógica. Lo que estamos haciendo es aplicar las Leyes de De Morgan para invertir la forma de escribir la condición.

Cualquiera sea la forma que hayan usado, es correcta.

A continuación, vamos a recorrer nuestro string de caracteres inválidos y vamos a utilizar la función strpos para chequear si alguno de ellos está ubicado en la primera posición.

El bucle cuenta desde el 0 hasta el último número que corresponde con la longitud menos uno del string $numeros. Es decir, de 0 a 9. Por lo tanto, este bucle se ejecuta 10 veces.

La función strpos devuelve el valor que corresponde a la posición en la cadena $usuario donde se encuentra el caracter $numeros[$i], que en cada iteración del bucle es un número distinto. Si la función devolviera un 0 significaría que uno de esos números está ubicado en la primera posición. Justamente lo que queremos verificar.

Por lo tanto, si efectivamente se devuelve un 0 (noten que se usa el comparador de identidad porque no sería lo mismo null, false o vacío) entonces, podemos poner la variable booleana $val en FALSE, para hacer que la validación resulte falsa.

Por último, aunque el enunciado no lo pida, es siempre conveniente mostrar un mensaje por pantalla para conocer el resultado del programa.

Ejercicio 3

Opción a) Código fuente / Programa funcionando
Opción b) Código fuente / Programa funcionando

En este ejercicio hay que contar la cantidad de veces que aparece una palabra en un texto. Vamos a ver dos tipos de resolución distintos. Primero, lo que vamos a hacer es utilizar nuevamente strpos, pero cambiando en cada ocurrencia la posición de búsqueda. Por ejemplo: si se encuentra lo que se busca en la posición 3, entonces en la próxima búsqueda, se empezará a buscar a partir de esa posición. Al mismo tiempo, en cada coincidencia, se incrementará una variable, para contar la cantidad de ocurrencias.

Veamos las primeras líneas de código.

Se define el texto con el cual se trabajará. Luego la aguja o palabra que se quiere buscar. Puede ser también un simple caracter. En esta caso, la idea es capturar la palabra “de”, pero no la sílaba “de”. ¿Se entiende la diferencia? Es por eso que la aguja es ” de “, con un espacio antes y otro después.

La variable $cant contará la cantidad de ocurrencias y $pos irá variando en cada pasada para alterar la posición inicial de búsqueda.

En esta ocasión vamos a usar un do… while, pero como ya saben, siempre hay más de una forma de resolver las cosas.

Dentro del bucle, la primera línea realiza la búsqueda de la variable $aguja dentro de $texto. El tercer parámetro sirve para indicarle a la función desde que posición debe empezar a buscar. En la primera iteración $pos vale 0, por lo tanto es como si ese parámetro no estuviera. Se buscará en toda la cadena.

Si no hubo ningún encuentro, strpos devuelve FALSE. Eso significaría que no hay ocurrencias. La variable $busqueda es booleana y es la única condición para seguir con el bucle. Como en este caso la condición sería falsa, entonces el bucle se terminaría.

¿Pero qué pasaría si hubiera coincidencia? Entonces caeríamos en el else. La variable $busqueda sería TRUE lo cual nos aseguraría una nueva búsqueda, ya que no se saldría del bucle. La variable $pos tomaría ahora un nuevo valor: el que devolvió la búsqueda actual más uno, lo cual hará que en la siguiente búsqueda, la ocurrencia actual no sea tenida en cuenta. Recuerden que strpos devuelve el valor que corresponde a la posición de la primera ocurrencia. La variable $cant se incrementa a modo de contador, cada vez que una búsqueda es exitosa.

El bucle se termina cuando ya no se encuentra nada.

Se puede mostrar ese mensaje por pantalla para informar los resultados. Tengan en cuenta que en caso de que no haya ninguna ocurrencia, entonces $cant va a valer 0 porque así se ha definido al principio del programa. Es decir, que está contemplado el caso de que no se encuentre nada en relación con el mensaje que se muestra al final. Quizás, se podría hacer un if que verifique si es cero y muestre el mensaje “No han habido coincidencias”, para ese caso particular.

Si bien todo esto funciona, existe una manera mucho más fácil de realizarlo. Veamos cómo.

La función str_replace simplifica de manera dramática la búsqueda. Si bien está hecha para buscar y reemplazar, podemos hacer un pequeño truco que nos sirve para lo que necesitamos en este caso. Este consiste en reemplazar lo buscado con exactamente lo mismo. Como ven, el primer parámetro y el segundo son la misma variable. El tercer parámetro dice dónde realizar la búsqueda y el cuarto, se pasa para que se cuenten la cantidad de reemplazos, que será la misma cantidad de coincidencias.

Esto nos muestra lo importante que es tener el conocimiento teórico sobre cada una de las funciones de un lenguaje.

Ejercicio 4

Código fuente / Programa funcionando

Este ejercicio está únicamente para mostrar la potencia de algunas funciones de PHP. En otro lenguaje quizás deberíamos trabajar mucho más para poder realizarlo.

Hay un texto en el cual se debe buscar. Hay una cadena de caracteres que se debe identificar dentro. Y hay una cadena de caracteres que debe reemplazarlo. Para todo eso, aparece nuevamente la función str_replace. El orden de los parámetros, como se ve en el código, es: lo que se quiere buscar, lo que lo va a reemplazar y el texto donde se va a realizar esta operación.

Recuerden que str_replace devuelve la cadena reemplazada, si es que logró reemplazar algo. Si no, devuelve la cadena exactamente igual a como se pasó por parámetro.

Ejercicio 5

Opción a) Código fuente / Programa funcionando
Opción b) Código fuente / Programa funcionando

Hay que validar un número de teléfono, que en el medio tiene un guión. Empecemos definiendo dos variables.

La primera variable será el string que vamos a validar. La segunda, una variable booleana que como ya hicimos antes, determinará si la validación ha sido pasada exitosamente o no.

Sabemos por el enunciado que los números de teléfono tienen el formato NNNN-NNNN. Eso quiere decir que los primeros cuatro caracteres son números del 0 al 9, al igual que los últimos cuatro. El caracter de la posición 4 debe ser un guión. Además, la longitud de la cadena debe ser de 9. Podemos empezar comprobando esto en el programa.

Tanto si el caracter 4 no es un guión como si la longitud del string no es de 9, entonces el teléfono es inválido. Por lo tanto podemos asignarle a $resultado el valor FALSE.

A continuación vamos a realizar una validación por rangos, aprovechando la tabla ASCII.

El código continua del bloque anterior. Si el teléfono tiene el guión donde corresponde y la longitud de la cadena es la correcta, entonces  vamos a recorrer caracter por caracter el teléfono mediante un bucle for. Atención porque en la posición 4 esperamos que haya un guión así que cuando lleguemos a ese punto, vamos a hacer un salto con continue. Para el resto de los casos, lo que hacemos es obtener el valor del caracter en la tabla ASCII mediante la función ord() y comprobar si se encuentra fuera del rango 48 / 59, que es el que corresponde a los números. Si esto es así, entonces la variable $resultado recibe FALSE y el teléfono pasa a ser inválido. Basta con que un solo caracter sea distinto de un número para que ocurra esto.

Por último, mostramos el mensaje de validación por pantalla:

Ahora veamos otra forma de hacerlo, utilizando la función strspn, que utiliza un string como máscara.

Tenemos cuatro condiciones vinculadas todas con un and. Esto significa que todas deben cumplirse para que la expresión completa del if sea válida.

La primera se debe entender de la siguiente forma. La función strspn devuelve la cantidad de caracteres que pertenecen a la máscara $mask que están en la cadena $telefono desde la posición 0 hasta que aparezca algún caracter que no esté en la máscara. Por ejemplo, con el valor que tiene $telefono en este ejemplo. strspn verifica el número 0, que es el primer caracter y como está en la máscara, busca el siguiente, que es un 1, que también está en la máscara. Hace esto de forma repetida hasta que llega al ‘-‘ que no pertenece a la máscara, en ese momento deja de buscar y devuelve la cantidad de caracteres que encontró que sí pertenecían a la máscara. En este caso, ese número es 4. Y es lo que queremos que sea, ya que todos los teléfonos tendrán el formato de cuatro números seguidos al principio. Por lo tanto, comparamos con 4 la salida de la función.

La segunda condición utiliza la misma función y exactamente el mismo procedimiento, pero en este caso se agregan dos parámetros. El primero le indica desde dónde debe empezar a buscar y el segundo es la cantidad de caracteres a chequear. Es decir que comenzará desde el caracter 5, que es el número 4 y luego chequeará los 3 siguientes, salvo que en el medio haya alguno que no pertenezca a la máscara. Al final, al igual que en la primera condición, devuelve la cantidad de caracteres que pertenecen a la máscara.

La tercera condición chequea que el caracter 4 sea un guión y la última, que la longitud de la cadena sea 9. Si se cumple todo junto, el teléfono será válido, si no, no.

Ejercicio 6

Código fuente / Programa funcionando

Hay que procesar una lista, que en este caso está en un array. Primero vamos a definirla.

Ahora vamos a recorrerla y a procesarla.

Para recorrer este array, vamos a usar un bucle for. Con la función substr vamos a extraer la parte numérica del código. El primer parámetro de esta función indica a partir de dónde se va a seleccionar y el segundo, cuántos caracteres se quiere extraer. El resultado se guarda en $extracto.

Luego, no debemos perder de vista que $extracto es un string y que hay que sumarle un número, como si fuera un entero. Podríamos hacer esto directamente ya que PHP convierte de forma automática las variables, sin embargo, es preferible utilizar (int) delante para forzar el pasaje a entero, antes de realizar la suma.

En la siguiente línea, lo que hacemos es sustituir el valor que tiene el array. ¿Con qué? Con el comienzo del código original (el primer caracter), utilizando nuevamente substr para extraerlo. Luego con el valor numérico actualizado tras haberle sumado 1000. Y finalmente, con el final del código, utilizando nuevamente substr, tomando 3 caracteres desde la posición 5. Para unir todas estas partes, se utiliza el operador de concatenación de strings, el punto. Que el valor de $num sea numérico no es un problema ya que la conversión de entero a string no genera inconvenientes.

Finalmente, a medida que los vamos procesando, mostramos el código por pantalla.

Y hasta aquí hemos llegado. Nos encontramos en la próxima clase teórica. ¡Los espero!

Soy programador web y me desempeño como Líder Técnico y de Proyectos en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.
 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*