Curso de PHP: Nivel Básico – Clase 5. Estructuras iterativas

Esta es la clase número 5 del Curso de programación de PHP Nivel Básico. Si lo necesitan, pueden buscar las clases anteriores para ponerse al día y también las clases prácticas donde explico ejercicios y muestro la resolución.

En esta clase abordaremos las estructuras iterativas; esto es, la forma de repetir porciones de código cuantas veces necesitemos agregando apenas unas pocas líneas. Veremos los distintos bucles: for, while, do… while, foreach y las sentencias break y continue. La teoría se entenderá mejor si siguen y exploran los ejemplos que voy mostrando. El código fuente completo de los ejemplos lo pueden ver aquí: código fuente de estructuras iterativas en PHP. Y la salida de ese código, pueden verla aquí: salida del código fuente de estructuras iterativas.

Les recomiendo que descarguen el código fuente, lo ubiquen en su servidor web local, lo estudien a medida que leen el artículo y que experimenten haciéndole modificaciones.

Bucles

Los algoritmos, que como ya expliqué son secuencias de instrucciones, a menudo requieren repetir uno o varios pasos. Esto significa que llegado un momento de la secuencia se debe volver a comenzar y repetir algunas partes. A esto lo podemos llamar bucle o en inglés loop.

En programación, un bucle o loop es una estructura que envuelve una porción de código y que hace que esta se repita las veces que se indique. De esta forma, es posible imprimir por pantalla 1000 veces un texto con apenas dos líneas de código. Más allá de alguna diferencia, los lenguajes de programación comparten los mismos tipos de bucles. Cada uno de estos loops tiene distintas opciones para configurarlos y más allá de que pueden usarse de forma indistinta, algunos son más útiles para algunas tareas y otros para otras.

Vamos a empezar a conocer los distintos tipos de bucles.

Bucle For

Este tipo de bucle tiene la siguiente estructura

Se escribe la palabra clave for y luego entre paréntesis van tres partes distinguibles separadas de punto y coma. Para usar este bucle se necesita al menos una variable. La primera parte consiste en una inicialización de la variable a utilizar. Para este ejemplo usamos una variable llamada $i. Van a ver que casi siempre se utiliza una i para estos bucles, pero entiendan que pueden poner cualquier nombre de variable. La segunda parte, luego del punto y coma, indica en qué condiciones el bucle va a ser ejecutado. Si las condiciones no están dadas, entonces el bucle terminará. En este caso, se ejecutará siempre que el valor de $i sea menor o igual que 1000. Por último, se indica de qué forma se alterará el valor de la variable a utilizar. La forma más común es incrementarla en 1, pero puede decrementarse, multiplicarse o aplicársele la función que se necesite. Entre llaves se pone el código que se desea repetir.

¿Cómo funciona? Se viene ejecutando el programa y se llega al for. La primera vez se ejecutará la primera parte de él haciendo la inicialización de la variable. Luego, el for chequeará con la segunda parte si está en condiciones de ejecutar el código entre llaves. Esta comparación, para este ejemplo es 0 <= 1000. Como esto es verdadero, sí se ejecutará el código entre llaves. Luego de esto, el for ejecutará la tercera parte de la sentencia donde se incrementa en 1 el valor de $i. Luego, nuevamente chequeará si está en condiciones de ejecutar el código entre llaves. La comparación esta vez es 1 <= 1000. Como esto nuevamente es verdadero, se ejecutará el código una vez más.

Esta secuencia se repetirá hasta que el valor de $i sea 1001. Es decir, el código entre llaves se ejecutará 1001 veces.

Hay que tener especial cuidado al usar la variable del bucle ($i) dentro de las llaves porque si se le altera el valor, esto afectará el bucle y puede ocasionar el cuelgue de nuestro script y derivar en del navegador sobre el cual lo ejecutamos. Si esto ocurre, a no desesperarse que es lo más normal del mundo y no provoca daños permanentes a la PC. Es más, sería raro trabajar con bucles y cada tanto no colgar la aplicación.

Conteo por pantalla con bucle for

Comienza a contar en 1, y se incrementa de a 1. El echo se mostrará siempre y cuando el valor de $i sea menor o igual que 10. El resultado de este ejemplo es:

Tablas de multiplicar con bucle for

Ahora veamos como armar las tablas de multiplicar metiendo un bucle dentro de otro

Aquí usamos una tabla de HTML para ayudar a tabular los datos. Primero, un for externo que se encarga de barrer las filas. Va de 1 a 9 y si prestan atención, verán que en vez de llaves hay dos puntos y un endfor;. Esto es la sintaxis alternativa de los bucles for en PHP y resulta muy útil al mezclar este tipo de código con HTML.

El bucle for interno es similar al externo, pero se usa otra variable, en este caso $r. Se guarda en $resultado el valor de $i multiplicado por $r y se muestra por pantalla, quedando dentro de un <td></td>.

La clave para entender este ejemplo es ver que para cada valor de $i, la $r va de 1 a 9. De esta forma, mientras que el bucle for externo se ejecuta sólo 9 veces, el interno se ejecuta 9 veces 9. Es decir, 81 veces. La salida del código es:

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

Recorrer arrays con for

Una de las utilidades de lo bucles es la posibilidad de recorrer arrays. Vamos a ver cómo hacer eso con este ejemplo.

Definimos una array de 7 elementos que representan temperaturas en grados celsius. El for arranca en 0, debe hacerlo puesto que la primera posición de los arrays enumerativos es siempre 0, salvo que se especifique lo contrario. La expresión a comparar para decidir si debe ejecutarse el código es interesante de analizar. $nro será un índice y según su valor obtendremos el elemento del array deseado. Si vale 2, podremos acceder al tercer elemento del array (¡Recuerden nuevamente que comienza en 0!).

Por otro lado, count es una función  que nos dice cuántos elementos tiene un array. Por lo tanto, la comparación es fácil de entender: el código entre llaves se ejecutará siempre que el índice $nro sea menor o igual que el tamaño del array. El -1 es porque el array es de 7 elementos, pero el índice va desde 0 a 6 porque nuevamente… ¡los elementos del array se empiezan a contar desde 0! Por último, se incrementa el valor de $i en una unidad.

El código entre llaves se ejecutará 7 veces. En este ejemplo, el if sirve para verificar si la temperatura es mayor que 20. Noten como se pone el índice $nro entre corchetes a continuación del nombre del array para indicar el elemento.

La salida del código es:

Si el índice que utilizan tiene un valor fuera del tamaño del array obtendrán un error de este tipo por parte del intérprete de PHP:

Bucle while

Este es otro tipo de bucle y tiene la siguiente estructura.

Se pone la palabra clave while y luego, entre paréntesis, una condición. El código entre llaves se ejecutará siempre que la condición sea verdadera. Es importante tener en cuenta que dentro de las llaves será necesario alterar el valor de la o las variables que aparezcan en la condición, porque de no hacerse eso, no se podrá salir nunca del bucle. La condición es una expresión que puede contener cualquier cantidad de variables vinculadas con operadores, al igual que en un if.

Entonces, un programa se ejecuta hasta el while y al llegar, primero se chequea si la condición es válida y si es así, se ejecuta el código entre llaves. Pero ¡cuidado! si la condición no es válida el código no se ejecutará nunca. Esto es importante entenderlo para después comprender el siguiente bucle llamado do… while.

Conteo simple con un bucle while

Vamos a hacer lo mismo que con el for, pero con un while.

La inicialización se hace afuera del while. La condición garantiza que el código entre llaves se ejecute siempre que la variable $contador sea menor o igual que 10. Noten que hay que alterar el valor de la variable. Y cuando digo alterar es importante que tenga convergencia hacia el el límite que impone la condición. ¿Qué quiero decir con esto? Que en cada iteración se acerque más al 10 y no que se aleje, porque en ese caso, el bucle sería infinito como si no se modificara el valor de $contador.

Tabla de multiplicar con bucles while

Vamos a ver el mismo ejemplo que tenía dos bucles for, pero con dos while.

Se usan dos variables que se inicializan. En este ejemplo verán la sintaxis alternativa de while, bastante intuitiva. Se usan los dos puntos y el endwhile; para cerrar la estructura. La condición de comparación es si la variables es menor o igual que 9. Al igual que en el ejemplo de los for, el while interno se ejecuta 81 veces y el externo sólo 9. La salida de este código es idéntica que el ejemplo de las tablas de multiplicar con for.

Recorrer arrays con while

Ahora veremos como recorrer un array usando un bucle while.

Se inicializa la variable índice por fuera. La condición de comparación usa el count que ya expliqué sobre el array y el -1 ya saben por qué se pone. En el código entre llaves se incrementa le valor de $indice.

Bucle do… while

Este es un bucle similar al while. Veamos la estructura.

Primero se pone la palabra clave do que en inglés significa “hacer” y luego, entre llaves, el código que se quiere ejecutar. Tras el cierre de llaves, se pone la palabra clave while y entre paréntesis una condición. La condición deberá ser verdadera para que el código entre llaves se vuelva a ejecutar.

Por lo tanto, la diferencia con el while es que en esta estructura, el código entre llaves se ejecutará siempre al menos una vez. Luego, se chequeará la condición y tal vez se vuelva a ejecutar o tal vez no.

Para variar un poco los ejemplos veamos una cuenta regresiva con este tipo de bucle.

Se inicializa fuera de la estructura la variable $c que será el contador. Se ejecuta el código decrementándose la variable y al final se realiza la comparación para comprobar si aún sigue siendo mayor que 0. La salida de este código es:

No hay sintaxis alternativa para este tipo de bucles. En general son poco usados ya que los programadores suelen preferir utilizar el while.

Bucle foreach

Estos bucles están especialmente hechos para trabajar con arrays y poder recorrerlos de forma sencilla. Veamos la estructura y sintaxis que tienen.

Se define un array, en este caso con equipos de fútbol de Argentina. Se pone la palabra clave foreach y entre paréntesis va, primero el nombre del array, luego la palabra clave as y después otra variable. Entre llaves irá lo que se debe repetir. En cada iteración, la variable que se use tomará el valor de cada elemento del array .

Por ejemplo, en este caso, $grande en la primera iteración tendrá el valor Boca, luego River y así sucesivamente.

Como ven, no hay índices ni hay que estar pendiente del tamaño del array. El foreach es la mejor herramienta que da PHP para recorrer arrays.

Break y Continue

Hay dos sentencias vinculadas a los bucles que van a ver en los manuales de PHP y otros lenguajes. No está recomendado su uso por alterar el paradigma de la programación estructurada. Recuerdo que en la universidad era casi un delito utilizarlos. Pero eso no quiere decir que no haya que saber cómo funcionan.

El break, que en inglés significa “romper” hace justamente eso. Rompe el bucle en el momento en que se ejecuta. Lo anula y se sigue ejecutando el código que aparece después. Veamos un ejemplo.

En este caso, lo uso en un while, pero también sirve con los otros tipos de bucles. Imaginen que se tiene un array con calificaciones de alumnos que van de 1 a 10, pero puede haber alguna inválida que tenga valor negativo o superior a 10. Supongamos ahora, que queremos identificar donde está el error. Se hace un while donde se recorre el array y al encontrarlo, se pone un break para evitar que el bucle siga recorriendo el array. Cuando se llega ahí, el while se interrumpe y se pasa al if que aparece abajo.

El continue sirve para saltear iteraciones en un bucle. Veamos un ejemplo.

<?php

Se quieren mostrar por pantalla los números del 1 al 9, excepto los que están entre el 4 y el 8. Entonces, se utiliza un if para identificarlos y luego un continue para saltear al siguiente paso del for.

Conclusiones

Los bucles se pueden usar de forma indistinta para lo que el programador necesite. Sin embargo, está claro que los bucles foreach son generalmente mucho mejores para recorrer arrays.

Los while y do… while son similares entre sí y requieren incluir variables antes y dentro del código a repetirse para poder funcionar correctamente. Los bucles se ejecutarán una cantidad de veces que, a priori, no puede determinarse.

Los bucles for son los más simples y pueden definirse sin mayores complicaciones en una única línea. Suelen utilizarse cuando se sabe de antemano cuántas iteraciones se necesitarán.

Es importante dominar este tema que es uno de los pilares de la programación. Si piensan un poco, se darán cuenta que los bucles son los que hacen aprovechar realmente la capacidad de procesamiento de la computadora.

Ejercicios propuestos

  1. Dado un array de 20 elementos que consiste en números reales (con coma decimal) y que cada elemento representa la venta del día de un comercio. Calcular el promedio de venta por día utilizando alguna estructura iterativa. Mostrar el resultado por pantalla.
  2. Dado el siguiente array: $nombres = array (‘roberto’,’juan’,’marta’,’moria’,’martin’,’jorge’,’miriam’,’nahuel’,’mirta’). Realizar un programa en PHP que lo recorra y genere un nuevo array con aquellos nombres que comiencen con la letra m. Definir qué bucle conviene usar y luego mostrar el array por pantalla sin usar var_dump ni print_r. Los nombres deben aparecer separados por coma.
  3. Realizar un programa que arme la estructura HTML de una tabla con 20 filas y 10 columnas utilizando dos bucles for. Dentro de las celdas debe ponerse una letra O.
  4. Dado un array enumerativo de 10 elementos de números enteros (sin coma decimal), encontrar el máximo de todos esos números usando una estructura iterativa y mostrarlo por pantalla.
  5. Idem anterior pero encontrar el mínimo.
  6. Hacer un programa que calcule todos los números primos entre 1 y 50 y los muestre por pantalla. Un número primo es un número entero que sólo es divisible por 1 y por sí mismo.

Bibliografía

  • Zend PHP5 Certification Study Guide de Davey Shafik con Ben Ramsey, php architect nanobooks
  • Estructuras de Datos Estáticas en Pascal, de Zulma Cataldi y Fernando J. Lage. Centro de Estudiantes de Ingeniería.
Soy programador web y me desempeño como Líder Técnico 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.
 

2 thoughts on “Curso de PHP: Nivel Básico – Clase 5. Estructuras iterativas

  1. Hola Alejandro! Muy bueno tu artículo. Sabes que estoy trabajando en un sistemita para una empresa en php y mysql y hay algo que no se me ocurre cómo resolver. Paso a explicártelo y si tenés un tiempito me contás tu opinión.

    Es un sistema que va “encadenando” clientes. En la tabla clientes está el campo id_cliente que es un autoincrement y a su vez en cada registro hay un campo bby que contiene el id del cliente que lo trajo a la empresa. Por ejemplo id_cliente = 2 tiene en el campo bby = 1, lo que significaria que el cliente con id 1 trajo a la empresa al cliente con id 2. Esto puede crecer hasta el infinito, porque id 2 pudo haber traido a id 3 e id 4 traer a id 5 y así sucesivamente.

    Ahora, si yo quiero saber todas las personas que están debajo de id 1, lo que incluiría las personas que trajeron id 2, id 3, id 4, etc… no se me ocurre cómo hacerlo. ¿Tenés alguna idea?

    Desde ya muchisimas gracias por tu tiempo!

  2. Ezequiel

    Tenés una estructura de tipo árbol inmersa en la base. No es nada trivial el problema. Necesitarías una especia de self join recursivo, algo que MySQL (imagino que es la base de datos que usás) no soporta.

    Si pudieras volcar todo el contenido de esa tabla a un árbol (o un array) quizás sería más fácil de manejar. Aunque desconozco qué volumen de datos estás manejando.

    Te recomiendo que consultes en un foro sobre bases de datos. Te van a poder orientar mejor que yo.

    ¡Saludos!

Deja un comentario

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


*