Hace unos días @chupetho76 pedía en Twitter tips para usar el foreach, en base a esa petición voy ha hacer un tips en el cual explicar el for, el foreach y sus diferencias.
En esta primera entrada de una serie de tres explicare el bucle for.
Bucle For
El manual de PHP define el bucle for como:
Los bucles for son los más complejos en PHP. Se comportan como sus homólogos en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresión (expr1) es evaluada (ejecutada) una vez incondicionalmente al comienzo del bucle.
En el comienzo de cada iteración, se evalúa expr2. Si se evalúa como TRUE
, el bucle continúa y se ejecutan la/s sentencia/s anidada/s. Si se evalúa como FALSE
, finaliza la ejecución del bucle.
Al final de cada iteración, se evalúa (ejecuta) expr3.
Cada una de las expresiones puede estar vacía o contener múltiples expresiones separadas por comas. En expr2, todas las expresiones separadas por una coma son evaluadas, pero el resultado se toma de la última parte. Que expr2 esté vacía significa que el bucle debería ser corrido indefinidamente (PHP implícitamente lo considera como TRUE
). Esto puede no ser tan inútil como se pudiera pensar, ya que muchas veces se debe terminar el bucle usando una sentencia condicional break en lugar de utilizar la expresión verdadera del for.
El bucle for es uno de los mas comunes en programación, haciendo un poco de memoria rápida creo que esta presente en la mayoría de lenguajes de programación, aunque la estructura puede variar un poco.
Su uso mas común, es el repetir un numero de veces una secuencia predeterminada.
for ($i=0; $i < 10; $i++) {
echo "Hola, soy el saludo numero " . $i . PHP_EOL;
}
Este código nos mostrara el mensaje 10 veces y los números que aparecerán serán del 0 al 9.
El análisis de las expresiones en este ejemplo seria: Desde que $i es 0 y mientras $i sea menor que 10 suma 1 a $i. En la primera pasada el valor de $i es 0 ya que la suma la efectúa en la siguiente iteración. Si quisiéramos que el primer numero fuera 1 tendriamos que cambiar el $i=0 a $i=1.
¿Si cambiaramos el $i++ a ++$i, se empezara desde el 1?
La respuesta a esta pregunta es no, ya que la expr2, como dice la definición de arriba si bien se evalúa al principio, el resultado se toma al final, por lo tanto el primer valor en ambos casos es 0.
Otras características del bucle for, es que se pueden poner mas condiciones dentro de las expresiones, separadas por comas.
for ($i=0, $j=9; $i < 10, $i++, $j--) {
echo "Hola, soy el saludo numero ". $i ." quedan ". $j ." . PHP_EOL;
}
Este código nos mostraría por ejemplo «Hola, soy el saludo numero 0 quedan 9», e iría incrementando el $i y decreciendo el $j.
También podemos dejar alguna expresión vacía, aunque tenemos que tener cuidado a la hora de escapar del bucle ya que podemos caer en uno de los problemas que tiene el bucle for, entrar en bucle infinito.
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
En este ejemplo la expr1 esta vacía, y controlamos con un if si el valor es mayor que 10, si lo es, escapamos del bucle con el break;
Recorrer cadenas de texto
Otro uso que puede tener el for es recorrer cadenas de texto carácter a carácter.
$cadena = "Hola mundo";
for ($i=0; $i < strlen($cadena); $i++) {
echo $cadena[$i] . PHP_EOL;
}
Este código nos mostrara por pantalla carácter a carácter la cadena de texto, una por linea.
Recorrer Arrays
También podemos recorrer arrays con el bucle for
$array = array('Hola', 'Mundo', 'Hello', 'World');
for ($i=0; $i < count($array); $i++) {
echo $array[$i].PHP_EOL;
}
En este ejemplo mostramos por pantalla cada uno de los elementos del array.
Recorrer letras
for ($i='a'; $i < 'z'; $i++) {
echo $i.PHP_EOL; // Mostraria a, b, c, d, e.. hasta la y
}
Si quisiéramos mostrar el abecedario completo, hasta la z tendríamos que hacerlo de otra manera ya que la comparación en la expresión $i <= ‘z’ no funcionara y nos mostrara hasta ‘yz’. Para mostrar hasta la z podemos, o bien sustituir en la función anterior la ‘z’ por ‘aa’ o bien hacer el bucle asi:
for ($i ='a'; ; $i++ ) {
echo $i.PHP_EOL; // Mostrariamos de la a hasta la z
if ($i == 'z') {
break;
}
}
En este ejemplo vemos también el no uso de la expr1 y la salida del bucle por medio del break dentro de una condición.
Este bucle también funcionaria con las mayúsculas, y el abecedario que mostrara por pantalla es el ingles (sin ñ).
Problemas del For
Los mayores problemas del for son el entrar en bucle infinito y el desbordamiento de buffer.
Tanto en el primero como en el segundo es muy fácil caer, es tan simple como confundirse en la expr1, y establecer que se remita mientras el valor sea menor que 0 » $i > 0″ y en el desbordamiento, el cual es mas común al recorrer arrays es establecer el numero máximo mayor que el numero de elementos. En el ejemplo de la cadena de texto he usado strlen para detectar la longitud de cadena y en el del array el count para contar el numero de elementos del array, tanto en uno u otro el criterio lo he establecido de la siguiente manera «$i < numeroTotal» en muchos sitios se utiliza este otro criterio «$i <= numeroTotal -1» que viene a significar lo mismo que el anterior pero mas corto.
¿Se pueden recorrer arrays con clave no numérica con el bucle for?
Sin tener el cuenta el ejemplo del bucle del alfabeto, la respuesta simple seria no, pero podríamos recorrer un array de claves no numéricas si este tiene las claves definidas como una de esas letras, siempre y cuando las letras estuvieran ordenadas, y no faltara ninguna entre medio, ya que si no devolvería error. Luego otra manera, que no seria directa seria crear una matriz numérica que tuviera como valores las claves del array que queremos recorrer.
http://es1.php.net/manual/es/control-structures.for.php
Me gusta esto:
Me gusta Cargando...