Esta es la ultima entrada de la trilogía del uso de Foreach y For, en ella vamos a ver las principales diferencias y ventajas de uno sobre otro.
El foreach no es un bucle
De primeras la principal diferencia la tenemos en la propia definición, ya que el foreach no es un bucle sino un constructor, el cual solo puede iterar en arrays y objetos, en cambio el for es un bucle, es decir, se repite tantas veces como nosotros queramos.
El foreach no puede recorrer cadenas de texto.
En uno de los ejemplos de uso de for, veíamos como podíamos recorrer carácter a carácter una cadena de texto, en cambio con el foreach no podemos hacerlo
En el foreach no es necesario poner el tamaño del array.
En el uso del for, a la hora de recorrer un array, tenemos que especificar hasta que posición tenemos que recorrerla, en cambio en foreach nos lo recorre del principio a fin. Esto supone una ventaja sobre el for, ya que en este si no especificamos bien el tamaño podemos obtener un error.
Cosas que apriori no se pueden hacer con el foreach
Modificar los valores de un array/objeto
Como vimos en la entrada del foreach, apriori no se pueden modificar los elementos de un array usando el foreach, y en realidad si que se puede hacer pasando el valor por referencia.
Recorrer un array al revés
Si vemos el funcionamiento del foreach, este realiza una copia del array, sitúa el puntero en el primer elemento y lo recorre hasta el final, según esto no seria posible recorrer un array de forma inversa, algo que con el bucle for, podríamos hacerlo de una manera sencilla, pero podemos hacerlo también con el foreach usando la función array_reverse dentro de la definición del foreach
$array = array(1, 2, 3, 4); foreach (array_reverse($cadena) as $var) { echo $var.PHP_EOL; }
En este ejemplo se nos mostraría los valores de la $array empezando desde el final, y si mostramos $array una vez finalizado, podremos ver que los valores no han modificado su orden, ya que el array_reverse se aplica solo a la copia de $array.
Conclusiones
Tengo que decir que en mi día a día uso mas veces el foreach que el for, el for solo lo utilizo cuando tengo que mostrar un numero determinado de mensajes, y en el caso de recorrer arrays suelo usar siempre el foreach, lo veo mas seguro, y me permite recorrer de una manera sencilla arrays con clave de texto.
Con estas entradas he intentado cubrir las características tanto del bucle for como del constructor foreach, seguramente me habré dejado algún ejemplo o alguna característica. Agradeceré vuestros comentarios, sugerencias y preguntas.
Tengo un problema con foreach y me preguntaba si podías aclarármelo. Este es el siguiente:
$tipos es un array que incluye clases de establecimiento. Y lo que intento es filtrar la consulta por tipos que paso a la variable $tipos.
Cuando hago la consulta:
foreach($tipos as $check) {
$result = mysql_query(«select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = ‘$check'»);
}
if (mysql_num_rows($result) > 0) {
…
Hace el bucle, pero va pisando los valores y solo da el último del array $tipos. Me ayudaría mucho que me orientaras, pues llevo dándole vueltas un buen tiempo y no doy con ello.
Gracias de antemano.
Hola Joaquín, ¿cómo almacenas los resultados de la consulta dentro del foreach? Si no los almacenas dentro de un array es normal que sólo te salga el ultimo, prueba a almacenarlos en una variable array, como por ejemplo $results[], o dependiendo del número de tipos que quieres consultar o como quieres mostrar los resultados, podrías modificar la consulta para realizar una única consulta para que fuera en vez de where =, in(rango), sustituyendo rango por el array de tipos después de realizar un implode, del tipo $valores = implode(«,», $tipos) . Así sólo tendrías que efectuar una consulta contra la base de datos y eso agilizaría el proceso.