La construcción foreach en PHP está especialmente diseñada para iterar sobre arrays. Si intentas usarlo en una variable con un tipo de datos diferente, PHP genera un error.

El bucle foreach en PHP se puede usar tanto con matrices indexadas como con matrices asociativas. Hay dos tipos de sintaxis de uso disponibles:

foreach (array as $value) {
   statements
}

El método anterior es útil cuando se desea iterar una matriz indexada. La sintaxis siguiente es más adecuada para matrices asociativas.

foreach (array as $key => $value) {
   statements
}

Sin embargo, ambos enfoques funcionan bien con la matriz indizada, ya que el índice de un elemento de la matriz también actúa como clave.

Uso del bucle «foreach» con una matriz indexada

El primer tipo de sintaxis anterior muestra un paréntesis delante de la palabra clave foreach. El nombre de la matriz que se va a recorrer va seguido de la palabra clave «as» y, a continuación, de una variable.

Cuando se inicia la primera iteración, el primer elemento de la matriz se asigna a la variable. Una vez finalizado el bloque de bucle, la variable toma el valor del siguiente elemento y repite las instrucciones en el cuerpo del bucle hasta que se agotan los elementos de la matriz.

Un uso típico del bucle foreach es el siguiente:

<?php
   $arr = array(10, 20, 30, 40, 50);
   foreach ($arr as $val) {
      echo "$val \n";
   }
?>

Ejemplo

PHP proporciona una función muy útil en array_search() que devuelve la clave de un valor dado. Dado que el índice en sí es la clave de una matriz indexada, el array_search() de cada $val devuelve el índice de base cero de cada valor. En el código siguiente se muestra cómo funciona:

<?php
   $arr = array(10, 20, 30, 40, 50);

   foreach ($arr as $val) {
      $index = array_search($val, $arr);
      echo "Element at index $index is $val \n";
   }
?>

Producirá el siguiente resultado:

Element at index 0 is 10
Element at index 1 is 20
Element at index 2 is 30
Element at index 3 is 40
Element at index 4 is 50

Ejemplo

La segunda variación de la sintaxis foreach desempaqueta cada elemento de la matriz en dos variables: una para la clave y otra para el valor.

Dado que el índice en sí mismo actúa como clave en el caso de una matriz indexada, la variable $k toma sucesivamente el índice incremental de cada elemento de la matriz.

<?php
   $arr = array(10, 20, 30, 40, 50);
   foreach ($arr as $k=>$v) {
      echo "Key: $k => Val: $v \n";
   }
?>

Producirá el siguiente resultado:

Key: 0 => Val: 10
Key: 1 => Val: 20
Key: 2 => Val: 30
Key: 3 => Val: 40
Key: 4 => Val: 50

Iteración de una matriz asociativa mediante el bucle «foreach»

Una matriz asociativa es una colección de pares clave-valor. Para iterar a través de una matriz asociativa, la segunda variación de la sintaxis foreach es adecuada. Cada elemento de la matriz se desempaqueta en dos variables, cada una de las cuales ocupa el valor de key y su valor.

Ejemplo

A continuación se muestra un ejemplo en el que se atraviesa una matriz de estados y sus respectivas capitales mediante el bucle foreach.

<?php
   $capitals = array(
      "Maharashtra"=>"Mumbai", "Telangana"=>"Hyderabad", 
      "UP"=>"Lucknow", "Tamilnadu"=>"Chennai"
   );

   foreach ($capitals as $k=>$v) {
      echo "Capital of $k is $v \n";
   }
?>

Producirá el siguiente resultado:

Capital of Maharashtra is Mumbai
Capital of Telangana is Hyderabad
Capital of UP is Lucknow
Capital of Tamilnadu is Chennai

Sin embargo, aún puede usar la primera versión de la instrucción foreach, donde solo se almacena en la variable el valor de cada par clave-valor de la matriz. A continuación, obtenemos la clave correspondiente al valor utilizando la función array_search() que habíamos utilizado antes.

<?php
   $capitals = array(
      "Maharashtra"=>"Mumbai", "Telangana"=>"Hyderabad", 
      "UP"=>"Lucknow", "Tamilnadu"=>"Chennai"
   );

   foreach ($capitals as $pair) {
      $cap = array_search($pair, $capitals);         
      echo "Capital of $cap is $capitals[$cap] \n";
   }
?>

Iteración de una matriz 2D mediante el bucle «foreach»

Es posible declarar una matriz multidimensional en PHP, en la que cada elemento de una matriz es otra matriz en sí misma. Tenga en cuenta que tanto la matriz externa como la sub-arry pueden ser una matriz indexada o una matriz asociativa.

En el siguiente ejemplo, tenemos una matriz bidimensional, que se puede llamar como matriz o matrices. Necesitamos bucles anidados para atravesar la estructura de matriz anidada de la siguiente manera:

<?php
   $twoD = array(
      array(1,2,3,4),
      array("one", "two", "three", "four"),
      array("one"=>1, "two"=>2, "three"=>3)
   );

   foreach ($twoD as $idx=>$arr) {
      echo "Array no $idx \n";
      foreach ($arr as $k=>$v) {
         echo "$k => $v" . "\n";
      }
      echo "\n";
   }
?>

Producirá el siguiente resultado:

Array no 0
0 => 1
1 => 2
2 => 3
3 => 4

Array no 1
0 => one
1 => two
2 => three
3 => four

Array no 2
one => 1
two => 2
three => 3