Programación en PHP/Bucles
Sintáxis:
while (condición) sentencia;
Su funcionamiento es sencillo, ya que primero se evalúa que la condición sea verdadera y luego se ejecuta, hasta que la condición pase a ser falsa; una sentencia while (Español: Mientras) puede que no se ejecute ni siquiera una vez, si su condición es inicialmente falsa.
Veamos un ejemplo de su uso:
<?php
$i = 1;
while($i <= 3) $i += 1;
echo 'La variable $i vale: ' . $i ;
?>
Salida:
La variable $i vale: 4
Esta sintaxis de la instrucción while solo permite el uso de una sentencia dentro del bucle, en el ejemplo anterior la sentencia $i += 1 es la única que se repite.
Un bucle while puede contener varias sentencia, encerrándolas entre llaves ({}) o usando ésta sintaxis alternativa:
while (condición):
sentencia;
sentencia;
.
.
.
sentencia;
endwhile;
Ejemplo con múltiples sentencias:
Sintaxis 1 | Sintaxis 2 |
---|---|
<?php
$i = 1;
while($i <= 5):
echo "\$i = $i" . "\n";
$i += 1;
endwhile;
?>
| <?php
$i = 1;
while($i <= 5)
{
echo "\$i = $i" . "\n";
$i += 1;
}
?>
|
Intentemos ahora un ejemplo más complicado.
<?php
$i = 1; $mult_2_3 = 0; $mult_2 = 0; $mult_3 = 0;
echo "Verifiquemos los múltiplos de 2 y 3 (del 1 al 10):\n";
echo "--------------------------------------------------\n";
while($i <= 10){
if(($i % 2 == 0) AND ($i % 3 == 0) )
{
echo "$i es múltiplo de 2 y de 3.\n";
$mult_2_3 += 1;
}elseif ($i % 2 == 0)
{
echo "$i es múltiplo de 2.\n";
$mult_2 += 1;
}elseif ($i % 3 == 0)
{
echo "$i es múltiplo de 3.\n";
$mult_3 += 1;
}else
{
echo "$i no es múltiplo de 2 ni de 3.\n";
}
$i += 1; //ojo: esta línea es muy importante!!!
}
echo "--------------------------------------------------\n";
echo "Entre 1 y 10 hay: \n";
echo " * '$mult_2_3' múltiplos de 2 y 3.\n";
echo " * '$mult_2' múltiplos de 2.\n";
echo " * '$mult_3' múltiplos de 3.\n";
echo "Los restantes '" . (10 - $mult_2_3 - $mult_2 - $mult_3) .
"' números no son múltiplos ni de 2 ni de 3.\n";
?>
Salida:
Verifiquemos los múltiplos de 2 y 3 (del 1 al 10): -------------------------------------------------- 1 no es múltiplo de 2 ni de 3. 2 es múltiplo de 2. 3 es múltiplo de 3. 4 es múltiplo de 2. 5 no es múltiplo de 2 ni de 3. 6 es múltiplo de 2 y de 3. 7 no es múltiplo de 2 ni de 3. 8 es múltiplo de 2. 9 es múltiplo de 3. 10 es múltiplo de 2. -------------------------------------------------- Entre 1 y 10 hay: * '1' múltiplos de 2 y 3. * '4' múltiplos de 2. * '2' múltiplos de 3. Los restantes '3' números no son múltiplos ni de 2 ni de 3.
Analicemos el ejemplo. La variable $i actúa como un contador indicándonos cuantas iteraciones han sido llevadas a cabo, además de ser usado para evaluar la condición de bucle while. Las variables $mult_2_3, $mult_2 y $mult_3 son también contadores, pero estos nos indican, respectivamente, cuantos múltiplos de 2 y 3 (simultáneamente), solo de 2, y solo de 3 se han encontrado. Una vez completadas las 10 iteraciones se muestran los valores de estas tres variables y se calcula la cantidad de números que no son múltiplos ni de 2 ni de 3.
Antes de terminar con el bucle while debemos ocuparnos de dos asuntos importantes: los bucles infinitos y la interrupción de un bucle.
Los bucles infinitos son aquellos en que la condición a evaluar siempre es verdadera, por lo que las iteraciones nunca se detienen. Antes de ejecutar un fragmento de código que contenga un bucle (sea while,do...while o for), es importante asegurarse de que el bucle eventualmente se detendrá. En nuestro ejemplo con números primos la sentencia $i += 1 asegura que el contador $i aumente una unidad en cada iteración hasta alcanzar el valor 11, haciendo así falsa la condición con lo que se termina el bucle.
Aunque un bucle se termina cuando la condición se evalúa a falsa hay ocasiones en que necesitamos interrumpir el bucle abruptamente. La instrucción break (Español: Interrupción) interrumpe inmediatamente la ejecución del bucle y el control se pasa a la instrucción inmediatamente posterior al while. Veamos un último par de ejemplos usando break:
Usos de break | |
---|---|
Para romper bucles infinitos | Para interrumpir el bucle |
<?php
$n = 1;
$i = 1;
while(true){
$i = $i + 1;
$n = $n * $i;
if ($n > 100) break;
}
echo "i = " . $i;
echo "n = " . $n;
?>
Salida:
i = 5 n = 120 | <?php
$n = 1;
$i = 50;
$mensaje = "No hay múltiplos de 11 entre " .
"50 y 100. (¿no hay?)";
while($i < 100){
if ($i % 11 == 0)
{
$mensaje = "El primer múltiplo de 11 " .
"entre 50 y 100 es: " . $i;
break;
}
$i += 1;
}
echo $mensaje;
?>
Salida:
El primer múltiplo de 11 entre 50 y 100 es: 55 |
Do...While
Su uso es similar a while, pero aquí, las sentencias que siguen al do (Español: Hacer) se ejecutan por lo menos una vez y se comprueba la condición luego de la primera iteración; así, si es verdadera la condición se repite por segunda vez, si es falsa se continúa con las sentencias inmediatamente después de la instrucción while. Tiene sólo una sintáxis.
Sintáxis:
do {
sentencia;
sentencia;
.
.
.
sentencia;
} while (condición);
Todo lo explicado referente al bucle while se aplica también al do...while, sin embargo la principal diferencia con este es que el do...while siempre ejecuta al menos la primera iteración, mientras que en el while pudiera no ejecutar ninguna iteración, esto ocurre si la condición es falsa desde antes del inicio del bucle.
Un ejemplo con do...while:
<?php
$i = 5;
$n = 1;
do {
$n = $n * $i;
$i -= 1;
}while($i > 1);
echo "5! es igual a: " . $n
?>
Salida
5! es igual a: 120
Claro que, si cambiamos la primera instrucción por $i = 0 el bucle se ejecutará al menos una vez, pues la condición se evalúa al final, y dará la salida (errónea):
0! es igual a : 0
Al programar un bucle es importante reflexionar por un momento si nos conviene usar while o do...while: ¿necesitamos que se evalúe la condición antes de la primera iteración? ¿o el bucle debe entrar al menos una vez antes de evaluar la condición?
For
Los bucles for (Español: Para) son los más complejos en PHP (y en otros lenguajes de programación). Su sintaxis es la siguiente:
Sintáxis:
for (inicialización; condición; actualización) sentencia;
Inicialización: Es una expresión que ejecuta una sola vez al inicio y predetermina el primer valor inicial, mas comúnmente asignado a una variable ejemplo:
:$i = 1;
Condición: Es una expresión que se evalúa como falsa o verdadera, si es falsa el bucle finaliza, en caso contrario el bucle ejecuta la sentencia ejemplo:
:$i <= 5;
Actualización: Es una expresión que modifica la expresión de inicialización comúnmente en incremento o decremento Ejemplo:
:$i += 1
Nota: Observe que en esta ultima expresión no lleva (;).
Completada así la primera iteración se vuelve a evaluar la segunda expresión, y si esta es verdadera se ejecuta nuevamente la sentencia, con esto se completa una segunda iteración. Las iteraciones continúan hasta que la segunda expresión sea evaluada a falso.
En resumen estas expresiones son la inicialización, donde se dá el valor inicial a la variable de control del bucle; la condición que inicia cada iteración solo si es evaluada a verdadero; y el actualización o paso que incrementa o decrementa la variable de control al final de cada iteración para garantizar que la condición eventualmente evalúe a falso. veamos ahora como se utiliza:
<?php
for($i = 1; $i <= 5; $i += 1) echo $i . "\n";
?>
Salida
1 2 3 4 5
Todas las expresiones de un bucle for pueden dejarse vacías, dejando al bucle iterar infinitamente, aunque en este caso suele interrumpirse con una sentencia break del mismo modo que se hace con el bucle while; Al igual que este último, tiene un par de sintaxis alternativas para múltiples sentencias:
Usado endfor | Usando corchetes |
---|---|
for (1ªexpr; 2ªexpr; 3ªexpr):
sentencia;
sentencia;
.
.
.
sentencia;
endfor;
| for (1ªexpr; 2ªexpr; 3ªexpr)
{
sentencia;
sentencia;
.
.
.
sentencia;
}
|
Y continuemos ahora con un ejemplo de bucle for con múltiples sentencias:
<?php
for($i = 2; $i <= 10; $i += 2)
{
echo "......................\n";
//contando números pares
echo "i vale: " . $i . "\n";
//sus cuadrados
echo "i^2: " . $i*$i . "\n";
//y sus inversos
echo "1/i: " . 1/$i . "\n";
}
?>
y la salida
...................... i vale: 2 i^2: 4 1/i: 0.5 ...................... i vale: 4 i^2: 16 1/i: 0.25 ...................... i vale: 6 i^2: 36 1/i: 0.166666666667 ...................... i vale: 8 i^2: 64 1/i: 0.125 ...................... i vale: 10 i^2: 100 1/i: 0.1
Bueno, ya sabemos como crear dos tipos de bucles, los while (o do...while) y los for. Aunque puedes hacer codificar programas que hagan lo mismo con cualquiera de los bucles lo más lógico sería usar bucles while cuando no sabes el número de iteraciones que debes hacer (y la condición es del tipo ($respuesta == "Si")), y bucles for cuando si lo sabes (y la condición es del tipo ($X <= 10)).
Foreach
Introducido en PHP 4 es una solución fácil para trabajar con arreglos, muy semejante a Perl y otros lenguajes, funciona solo en arreglos y presentara un error al utilizar una variable con diferente tipo o no inicializada. Existen dos sintaxis la segunda opción en menor pero tiene mejor uso que la primera.
Sintáxis:
<p>foreach</p>
foreac<html>
<body>h (expresión_arreglo as $valor)
sentencia
foreach (expresión_arreglo as $llave => $valor)
sentencia
</body>
</html>
No hay comentarios:
Publicar un comentario