· Estructuras repetitivas
while
Los bucles while son el tipo más sencillo de bucle en PHP. Se comportan igual que su contrapartida en C. La forma básica
de una sentencia while es:
while (expr)
sentencia
El significado de una sentencia while es simple. Le
dice a PHP que ejecute las sentencias anidadas, tanto
como la expresión while se evalúe como
TRUE. El valor de la expresión es verificado
cada vez al inicio del bucle, por lo que incluso si este valor
cambia durante la ejecución de las sentencias anidadas, la ejecución
no se detendrá hasta el final de la iteración (cada vez que PHP ejecuta
las sentencias contenidas en el bucle es una iteración). A veces, si la
expresión while se evalúa como
FALSE desde el principio, las sentencias
anidadas no se ejecutarán ni siquiera una vez.
Al igual que con la sentencia if, se pueden agrupar
varias instrucciones dentro del mismo bucle while
rodeando un grupo de sentencias con corchetes, o
utilizando la sintaxis alternativa:
while (expr):
sentencias
...
endwhile;
Los siguientes ejemplos son idénticos y ambos presentan los números
del 1 al 10:
<?php/* ejemplo 1 */$i = 1;
while ($i <= 10) {
echo $i++; /* el valor presentado sería
$i antes del incremento
(post-incremento) */}/* ejemplo 2 */$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;?>
{
Intrucción_1;
:
Intrucción_n;
}
Esta instrucción for consta de tres parámetros, que son:
- Inicialización de la variable que se utilizará en la condición.
- Condición que se debe cumplir para permanecer en el ciclo.
- Modificación de la variable puesta en juego.
El código sería el siguiente:
| <Html> <Title> Tabla de Cuadrados y Cubos </Title> <Body> <?PHP echo "<Table align=Center Border=2 width=60%>"; echo"<Tr>"; echo"<th>"; echo " Número "; echo"</Th>"; echo"<th>"; echo " Cuadrado "; echo"</Th>"; echo"<th>"; echo " Cubo "; echo"</Th>"; echo"</Tr>"; for ($i=1; $i<=15; $i++) { $cuadrado= $i * $i; $cubo = $i * $i * $i; echo"<Tr>"; echo"<td align=Center>"; echo ($i); echo"<td align=Center>"; echo ($cuadrado); echo"<td align=Center>"; echo ($cubo); echo"</Tr>"; } echo "</Table>"; ?> </Body> </Html> |
do-while
Los bucles do-while son muy similares a los
bucles while, excepto que la expresión verdadera es
verificada al final de cada iteración en lugar que al principio.
La diferencia principal con los bucles while es
que está garantizado que corra la primera iteración de un bucle
do-while (la expresión verdadera sólo es verificada al
final de la iteración), mientras que no necesariamente va a correr con un
bucle while regular (la expresión verdadera es
verificada al principio de cada iteración, si se evalúa como
FALSE justo desde el comienzo, la ejecución del
bucle terminaría inmediatamente).
Hay una sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);?>
El bucle de arriba se ejecutaría exactamente una sola vez, ya que después de la primera
iteración, cuando la expresión verdadera es verificada, se evalúa como
FALSE ($i no es mayor que 0) y termina la ejecución
del bucle.
Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del
bucle do-while, para permitir parar la ejecución en
medio de los bloques de código, mediante el encapsulado con
do-while (0), y utilizando la sentencia break.
El siguiente fragmento de código demuestra esto:
<?phpdo {
if ($i < 5) {
echo "i no es lo suficientemente grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i está bien";
/* procesar i */} while (0);?>
for
Los bucles for son los ciclos más complejos en PHP.
Se comportan como sus contrapartes 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, la
expr2 es evaluada, Si es
TRUE, el bucle continúa y las sentencias
anidadas son ejecutadas. Si se evalúa como
FALSE, termina la ejecución del bucle.
Al final de cada iteración, la expr3 es
evaluada (ejecutada).
Cada una de las expresiones puede estar vacía o contener múltiples
expresiones separadas por comas. En la expr2, todas
las expresiones separadas por una coma son evaluadas pero el resultado se toma
de la última parte.
Que la expr2 esté vacía significa que el bucle deberá
ser corrido indefinidamente (PHP implícitamente lo considera como
TRUE, como en C). Esto puede no ser tan inútil como se
pudiera pensar, ya que muchas veces se quiere terminar el bucle usando
una sentencia condicional break
en lugar de utilizar la expresión verdadera del
for.
Considere los siguientes ejemplos. Todos ellos muestran los números
del 1 al 10:
<?php/* ejemplo 1 */for ($i = 1; $i <= 10; $i++) {
echo $i;
}/* ejemplo 2 */for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}/* ejemplo 3 */$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}/* ejemplo 4 */for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);?>
Por supuesto, el primer ejemplo parece ser el mejor (o
quizás el cuarto), pero se puede encontrar que la posibilidad de usar expresiones
vacías en los bucles for resulta útil en muchas
ocasiones.
PHP también soporta la sintaxis alternativa de los dos puntos para
bucles for.
for (expr1; expr2; expr3):
sentencia
...
endfor;
Es una cosa común a muchos usuarios iterar por medio de arrays como en el
ejemplo de abajo.
<?php/*
* Este es un array con algunos datos que se desean modificar
* cuando se corra por el bucle for.
*/$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}?>
El problema radica en la segunda expresión del for. Este código puede ser lento
porque tiene que calcular el tamaño del array en cada iteración.
Dado que el tamaño nunca cambia, se pueden optimizar fácilmente usando una
variable intermedia para almacenar el tamaño y usarla en el bucle en lugar
del sizeof. El siguiente ejemplo ilustra esto:
<?php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}?>foreach
El constructor foreach proporcina un modo sencillo de
iterar sobre arrays. foreach funciona sólo sobre arrays
y objetos, y emitirá un error al intentar usarlo con una variable
de un tipo diferente de datos o una variable no inicializada. Existen dos
sintaxis:
foreach (expresión_array as $valor)
sentencias
foreach (expresión_array as $clave => $valor)
sentencias
La primera forma recorre el array dado por
expresión_array. En cada iteración, el valor
del elemento actual se asigna a $valor y
el puntero interno del array avanza una posición (así en la próxima
iteración se estará observando el siguiente elemento).
La segunda forma además asigna la clave del elemento actual a
la variable $clave en cada iteración.
También es posible
personalizar la iteración de objetos.
Nota:
Cuando foreach inicia su ejecución, el puntero interno del array se pone automáticamente en el primer elemento del array. Esto significa que no es necesario llamar la función reset() antes de un bucle foreach.Ya que foreach depende el puntero de array interno, cambiar éste dentro del bucle puede conducir a un comportamiento inesperado.
Para poder modificar directamente los elementos del array dentro de bucle, se ha de anteponer
& a $valor. En este caso el valor será asignado por
referencia.
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}// $array ahora es array(2, 4, 6, 8)unset($valor); // rompe la referencia con el último elemento?>
Referenciar $valor sólo es posible si el array iterado puede ser
referenciado (es decir, si es una variable). El siguiente código no funcionará:
<?phpforeach (array(1, 2, 3, 4) as &$valor) {
$valor = $valor * 2;
}?>
Advertencia
La referencia del $valor y el último elemento del array
permanecen aún después del bucle foreach. Se recomienda
destruirlos con unset().
Nota:
foreach no soporta la capacidad de suprimir mensajes de error usando '@'.
Se puede haber notado que las siguientes construcciones son funcionalmente
idénticas:
<?php
$array = array("uno", "dos", "tres");reset($array);
while (list(, $valor) = each($array)) {
echo "Valor: $valor<br />\n";
}
foreach ($array as $valor) {
echo "Valor: $valor<br />\n";
}?>
Las siguientes construcciones también son funcionalmente idénticas:
<?php
$array = array("uno", "dos", "tres");reset($array);
while (list($clave, $valor) = each($array)) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
foreach ($array as $clave => $valor) {
echo "Clave: $clave; Valor: $valor<br />\n";
}?>
Algunos ejemplos más para demostrar su uso:
<?php/* Ejemplo 1 de foreach: sólo el valor */$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valor actual de \$a: $v.\n";
}/* Ejemplo 2 de foreach: valor (con su notación de acceso manual impreso con fines ilustrativos) */$a = array(1, 2, 3, 17);$i = 0; /* sólo para efectos ilustrativos */foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}/* Ejemplo 3 de foreach: clave y valor */$a = array(
"uno" => 1,
"dos" => 2,
"tres" => 3,
"diecisiete" => 17);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}/* Ejemplo 4 de foreach: arrays multidimensionales */$a = array();$a[0][0] = "a";$a[0][1] = "b";$a[1][0] = "y";$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}/* Ejemplo 5 de foreach: arrays dinámicos */foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}?>
No hay comentarios:
Publicar un comentario