Rango? foreach? Mmmmm …. Lo primero que se viene a la cabeza es construir un array con todos los valores del rango y pasar este array por el bucle foreach. Por ejemplo, para hacer un foreach para todos los números entre el 1 y 9, ambos incluidos:

$numeros = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

echo "<ul">;

foreach($numeros as $numero) {
     echo "<li>Número: ". $numero . "</li>;
}

echo "</ul>

El ejemplo anterior es totalmente válido, sólo tiene un «pero». Imagina que queremos hacer el foreach para todos los números entre el 0 y 100.000. ¿Vas a construir el array con todo esos números de forma manual? Ni loco. Si piensas en utilizar un bucle for para construir el array o hacer directamente el bucle, puedes, te saldrá bien:

echo "<ul">;

for($numero = 1, $numero <= 100000, $numero += 1 ) {
     echo "<li>Número: ". $numero . "</li>;
}

echo "</ul>

Y existe otra posibilidad, utilizar la función range(). Esta función nativa de PHP permite crear un array que contenga todos los valores comprendidos en un determinado rango y con el incremento que deseemos entre cada valor. Tiene la siguiente sintaxis:

array range ( mixed $comienzo , mixed $final [, number $incremento = 1 ] )

Por ejemplo:

  • Rango del 0 al 100 con incrementos de 1 (el incremento de 1 puede omitirse): range(0, 100)
  • Rango del 0 al 100 con incrementos de 3: range(0, 100, 3)

Así, podríamos hacer un bucle foreach para todos los números entre 0 y 100.000 con incrementos de 1:

echo "<ul">;

foreach( range(0, 100000) as $numero ) {
     echo "<li>Número: ". $numero . "</li>;
}

echo "</ul>

range() también se puede utilizar con letras. Por ejemplo:

echo "<ul">;

//array("a", "b", "c", "d", "e", "f")
foreach( range("a", "f") as $letra ) {
     echo "<li>Letra: ". $letra . "</li>;
}

echo "</ul>

Para hacer lo mismo con un bucle for habría que echar mano de chr() y controlar el valor decimal de la tabla ASCII correspondientes al rango de letras que deseemos. Por ejemplo, el rango a – f corresponde en la tabla ASCII a 97 – 102:

echo "<ul">;

for( $char = 97, $char <= 102, $char += 1 ) {
     echo "<li>Letra: ". chr($char) . "</li>;
}

echo "</ul>

¿Alguna sugerencia más para bucles sobre un rango de datos?