programacion-bucle-foreach

El bucle FOREACH

El bucle FOREACH es una estructura de control diseñada específicamente para recorrer y acceder a los elementos de una colección de manera simplificada.

Las colecciones de elementos son una herramienta muy poderosa que usaremos todos los días. Por ejemplo, podemos guardar un conjunto de números, de textos, los artículos que ha comprado un cliente, o incluso las funciones a ejecutar sobre una variable.

Al trabajar con colecciones, una necesidad que vamos a encontrar frecuentemente es realizar una acción sobre todos los elementos de una colección. Ahí es donde entra en juego el bucle FOREACH.

En lenguaje natural, un bucle FOREACH significa:

Para cada elemento de esta colección, haz esto

Que en código sería una cosa parecida a la siguiente.

foreach elemento in coleccion
{
   // acciones que hacer en cada elemento
}

Donde,

  • Se recorrería la colección desde principio a fin
  • En cada iteración elemento se actualiza con el elemento actual
  • Se continua hasta que se han recorrido todos los elementos

programacion-bucle-foreach

Esquema FOREACH

En cada iteración, el bucle FOREACH asigna el siguiente elemento de la colección a la variable elemento y ejecuta el bloque de código asociado. Esto se repite hasta que se han procesado todos los elementos de la colección.

Equivalencia con otros bucles

Si tuviéramos que hacer el mismo comportamiento con un bucle WHILE, por ejemplo, tendríamos que hacer algo así

indice = 0;
while(queden_elementos_pendientes)
{
	indice ++;
	elemento = coleccion[indice];
	
	// acciones que hacer con cada elemento
}

Como vemos, este es el mismo comportamiento que hemos definido anteriormente para el bucle FOREACH. Pero nos evita la complejidad de manejar índices o iteradores, permitiendo un código más legible y conciso.

Ejemplos de bucles FOREACH en distintos lenguajes

El bucle FOREACH es común en muchos lenguajes de programación. Algunos disponen de una palabra reservada específica foreach, mientras que otros emplean la propia palabra for.

Por ejemplo, en el caso de C# la sintaxis de un bucle FOREACH es así,

var coleccion = new List<int> {1, 2, 3, 4, 5};

foreach (var elemento in coleccion) {
	Console.Write(elemento + " ");
}

En el caso de C++ (sí, ¡también tiene FOREACH!) es similar a la sintaxis de Java, empleando la palabra reservada for.

auto coleccion = {1, 2, 3, 4, 5};

for (auto elemento : coleccion) {
	std::cout << elemento << " ";
}

PHP también dispone de una palabra reservada para bucles FOREACH,

$coleccion = [1, 2, 3, 4, 5];

foreach ($coleccion as $elemento)
{
    echo $elemento . " ";
}

Java, por su parte, usa la palabra reservada for con una sintaxis especial para realizar un bucle FOREACH, quedando así

var coleccion = new int[]{1, 2, 3, 4, 5};

for (var elemento : coleccion) {
	System.out.println(numero);
}

Por otro lado, Python el bucle FOREACH se realiza con la palabra reservada for. De hecho, Python no dispone de un bucle FOR como tal, siempre es un bucle FOREACH.

coleccion = [1, 2, 3, 4, 5]

for elemento in coleccion:
    print(elemento)

Por último, JavaScript no tienen un bloque FOREACH como tal, definido como parte del lenguaje. Esto se resolvió el método .forEach(...), que está disponible como método de la colección. Por lo que así conseguiríamos la funcionalidad de un bucle FOREACH.

let coleccion = [1, 2, 3, 4, 5];

coleccion.forEach(elemento => {
    console.log(elemento);
});

Y de forma similar en TypeScript

let coleccion: number[] = [1, 2, 3, 4, 5];

coleccion.forEach(elemento => 
{
    console.log(elemento);
});

Como vemos, la mayoría de lenguajes tienen el concepto de FOREACH, como bucle que nos permite realizar una acción en todos los elementos de una colección.

Algunos lenguajes como C# o PHP disponen de una palabra reservada foreach. Mientras que otros lenguajes como C++ o Java emplean variaciones de sintaxis empleando for.

Por otro lado, algunos lenguajes como JavaScript, TypeScript, o Kotlin, carecen de un bucle FOREACH propio del lenguaje. En su lugar, proporcionan la funcionalidad mediante un método de la colección.

En cualquier caso, la funcionalidad y el objetivo es el mismo y, aparte de las diferencias de sintaxis, básicamente son equivalentes.

El bucle FOREACH simplifica la realización de bucles sobre colecciones, resultando en un código más legible y conciso. Además, evita errores comunes relacionados con el acceso incorrecto a los elementos.

Se utiliza ampliamente en situaciones donde se requiere recorrer y procesar todos los elementos de una colección, como la búsqueda, filtrado, transformación o cálculos sobre los elementos.