4. Bucles
Un bucle, o loop, se utiliza para repetir un conjunto de instrucciones en una serie de ocasiones definida. Ello quiere decir que puedes realizar la misma tarea tantas veces como necesites: una, ninguna, x veces; pero no infinitas porque sino nunca llegaría a terminar de generarse el HTML. Cada repetición se denomina iteración.
Nada mejor que un ejemplo para probar su potencial. Si ejecutas el siguiente código...
<html>
<body>
<h1>¿Cuantos años tienes?</h1>
<select>
<?php foreach (range(1, 10) as $num): ?>
<option value="<?php echo $num; ?>"><?php echo $num . ' años'; ?></option>
<?php endforeach; ?>
</select>
</body>
</html>
... te generará este HTML.
<html>
<body>
<h1>¿Cuantos años tienes?</h1>
<select>
<option value="1">1 años</option>
<option value="2">2 años</option>
<option value="3">3 años</option>
<option value="4">4 años</option>
<option value="5">5 años</option>
<option value="6">6 años</option>
<option value="7">7 años</option>
<option value="8">8 años</option>
<option value="9">9 años</option>
<option value="10">10 años</option>
</select>
</body>
</html
Lo más probable es que el código sea indescifrable para tus ojos y estés buscando la ventana más cercana para saltar. ¡Alto! Aún no me interesa que comprendas su significado, pero si su potencial. A pesar de su sencillez, con 3 líneas de PHP, hemos generado 10 de HTML y porque nos hemos parado. Ahora ponte en el caso que tu jefe te pida una tabla con los años del 1890 al 2000. Si haces un loop similar al ejemplo lo tiene antes de que la máquina de café termine de hacerte un cortado. ¡Super útil! ¿Puedes imaginar sitios web que usen loops para simplificar el trabajo? Te propongo que mires: tiendas, blogs, periódicos, redes sociales...
Dentro de PHP existen 4 tipos de bucles:
- foreach
- for
- while
- do-while
Todos son diferentes estrategias a la hora de decidir el número de veces que se va a iterar, en el fondo hacen lo mismo. Veamos uno por uno como funcionan.
foreach
Es la forma más sencilla de iterar un array.
$animalesFantasticos = ['fénix', 'dragón', 'grifo', 'pegaso', 'cerbero'];
foreach ($animalesFantasticos as $animal) {
echo $animal . ' ';
}
// fénix dragón grifo pegaso cerbero
En caso de que necesitemos la key, existe otra forma para utilizarlo.
$animalesFantasticos = ['fénix', 'dragón', 'grifo', 'pegaso', 'cerbero'];
foreach ($animalesFantasticos as $posicion => $animal) {
echo "El animal $animal ocupa la posición $posicion \n";
}
// El animal fénix ocupa la posición 0
// El animal dragón ocupa la posición 1
// El animal grifo ocupa la posición 2
// El animal pegaso ocupa la posición 3
// El animal cerbero ocupa la posición 4
Respecto a range() es una función nativa de PHP que genera un array de elementos. Admite 2 o 3 parámetros.
range($inicio, $fin, $pasos);
var_dump(range(10, 15));
/*
array(6) {
[0] =>
int(10)
[1] =>
int(11)
[2] =>
int(12)
[3] =>
int(13)
[4] =>
int(14)
[5] =>
int(15)
}
*/
var_dump(range(0, 100, 20));
/*
array(6) {
[0] =>
int(0)
[1] =>
int(20)
[2] =>
int(40)
[3] =>
int(60)
[4] =>
int(80)
[5] =>
int(100)
}
*/
Para insertar un bucle dentro de un HTML tienes 2 formas. En el ejemplo esta escrito con foreach pero es válido cualquier loop o condicional.
Sintaxis clásica.
<html>
<body>
<?php foreach (range(1, 5) as $num) { ?>
<p><?php echo $num; ?></p>
<?php } ?>
</body>
</html>
Sintaxis alternativa.
<html>
<body>
<?php foreach (range(1, 5) as $num): ?>
<p><?php echo $num; ?></p>
<?php endforeach; ?>
</body>
</html>
Ambos dan el mismo resultado.
<html>
<body>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
</body>
</html>
Recorrer arrays multidimensionales
Para poder leer un array con más de una dimensión, tendremos que realizar bucles anidados. O un bucle dentro de otro bucle.
Tomamos de partida un array, de 2 dimensiones, que vimos en la lección anterior.
$zara = [
123 => [
'nombre' => 'Camisa a cuadros',
'precio' => 29.95,
'sexo' => 'Hombre'
],
234 => [
'nombre' => 'Falda manga',
'precio' => 19.95,
'sexo' => 'Mujer'
],
345 => [
'nombre' => 'Bolso minúsculo',
'precio' => 50,
'sexo' => 'Mujer'
]
];
Si yo quisiera mostrar toda la información de los productos.
foreach ($zara as $producto) {
var_dump($producto);
}
/*
array(3) {
'nombre' =>
string(16) "Camisa a cuadros"
'precio' =>
double(29.95)
'sexo' =>
string(6) "Hombre"
}
array(3) {
'nombre' =>
string(11) "Falda manga"
'precio' =>
double(19.95)
'sexo' =>
string(5) "Mujer"
}
array(3) {
'nombre' =>
string(16) "Bolso minúsculo"
'precio' =>
int(50)
'sexo' =>
string(5) "Mujer"
}
*/
Ha iterado 3 veces, y en cada ocasión me ha devuelvo un array. Es lo que hay contenido dentro del primer array, otros arrayss. Entonces debo recorrer cada uno con otro foreach.
foreach ($zara as $producto) {
foreach ($producto as $elemento) {
echo "$elemento \n";
}
}
// Camisa a cuadros
// 29.95
// Hombre
// Falda manga
// 19.95
// Mujer
// Bolso minúsculo
// 50
// Mujer
Y ahora sí lo tengo.
Los bucles anidados se pueden realizar con cualquier tipo de
loop. Te recomiendo que trabajes siempre que puedas conforeachya que será más difícil que acabes teniendo un bucle infinito.
for
El loop más complejo y similar a otros lenguajes (C, Java, Javascript...).
for (variable inicio; condicional; incremento) {
...
}
for ($i = 0; $i < 10; $i++) {
echo "$i \n";
}
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
$i++es equivalente a$i += 1o$i = $i + 1. Básicamente incrementa en 1 la variable. Además dispones de su antítesis:$i--.
while
Es el bucle más sencillo y peligroso. Debes prestar mucha atención para que se acabe en algún momento.
while (condicional) {
...
}
$i = 1;
while ($i < 10) {
echo $i++;
}
// 123456789
do-while
Se comporta igual que while, salvo que se compromete a ejecutarse al menos una vez. Independientemente de si se cumple la condicional. El secreto radica en que primero se ejecuta las instrucciones y a continuación se evalúa el condicional.
do {
...
} while (condicional)
$i = 1;
do {
echo $i++;
} while ($i < 10);
// 123456789
$i = 20;
do {
echo $i++;
} while ($i < 10);
// 20
Actividad 1
- Dime en cada caso si entraría el condicional.
1
if (True && True)
2
if (False && True)
3
if (1 == 1 && 2 == 1)
4
if ("test" == "test")
5
if (1 == 1 || 2 != 1)
6
if (True && 1 == 1)
7
if (False && 0 != 0)
8
if (True || 1 == 1)
9
if ("test" == "testing")
10
if (1 != 0 && 2 == 1)
11
if ("test" != "testing")
12
if ("test" == 1)
13
if (!(True && False))
14
if (!(1 == 1 && 0 != 1))
15
if (!(10 == 1 || 1000 == 1000))
16
if (!(1 != 10 || 3 == 4))
17
if (!("testing" == "testing" && "Zed" == "Cool Guy"))
18
if (1 == 1 && (!("testing" == 1 || 1 == 0)))
19
if ("chunky" == "bacon" && (!(3 == 4 || 3 == 3)))
20
if (3 == 3 && (!("testing" == "testing" || "PHP" == "Fun")))
Actividad 2
- Pide el año de nacimiento.
- Calcula la edad.
- Si es mayor de edad, dile que puede pasar dentro.
- Si es menor, tírale.
- Si tiene más de 65 años, dile que es demasiado mayor para entrar.
Pro:
- Obten el año del sistema en lugar de escribirlo a mano en una variable.
Pro2:
- Pide además el día y el mes de nacimiento para saber si ha complido el año actual.
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.