7. Estructuras de control.

Page 1

Capítulo 7 Estructuras de control

37

7 Estructuras de control Las estructuras típicas de control de flujo son el if/elseif/else, el while y el do ... while, el for y el foreach, el break, el continue y el switch. Cada una de estas estructuras es controlada por una o más variables.

if/elseif/else La estructura if corresponde al si del pseudocódigo, puede incluir varias variables en la condición, al igual que elseif que sería un si_no, si en pseudocódigo o también acompañada de un else, si_no en pseudocódigo, que no lleva variables o parámetros de control. <?php if (expresión) sentencia ?>

La expresión o variable es evaluada como booleana, es decir, como VERDADERA o FALSA. Una típica estructura de control de este tipo en php podría ser: <?php if($variable == "SI") { echo "La variable vale SI"; } elseif($variable == "NO") { echo "La variable vale NO"; } else { echo "No sabemos qué valor tiene la variable"; } ?>

Programación

Arturo Ruvalcaba


38

Capítulo 7 Estructuras de control

Cuando estas estructuras sólo tienen una sentencia implicada en su ejecución podemos ahorrarnos las llaves: <?php if($variable == "SI") echo "La variable vale SI"; ?>

pero conviene ponerlos para ver más claramente cuando se cierra y abre cada estructura. Un error muy frecuente es poner al final del if un punto y coma ; lo que invalida el control de la estructura. <?php $variable = "NO"; if($variable == "SI"); //esto no funcionará echo "La variable vale SI"; ?>

La instrucción echo se ejecutará siempre independientemente de la estructura de control. Uso del operador condicional El operador condicional (?:) es un método corto para representar una condición simple. La sintaxis básica es la siguiente: condición ? valor if true : valor if false; A continuación un ejemplo: $edad = 17; $persona = $edad > 17 ? ‘adulto’ : ‘joven’; La segunda línea compara el valor de $edad. Si es mayor que 17, $persona toma el valor de ‘adulto’, en caso contrario el valor de ‘joven’. El código equivalente si se usa if … else es el siguiente: If $edad > 17 { $persona = ‘adulto’; } else { $persona = ‘joven’; }

Programación

Arturo Ruvalcaba


39

Capítulo 7 Estructuras de control

Referencias: •

(C) PHP Documentation Group if (http://es.php.net/manual/es/print/controlstructures.php#control-structures.if) (C) PHP Documentation Group else (http://es.php.net/manual/es/print/controlstructures.else.php) (C) PHP Documentation Group elseif (http://es.php.net/manual/es/print/controlstructures.elseif.php)

• •

while La estructura while corresponde al mientras del pseudocódigo, es controlada por una variable de condición. El comportamiento es igual al que toman estos bucles en C, siendo el tipo de bucle más fácil de implementar. while (parámetro) sentencia La estructura while le dice a PHP que ejecute la o las sentencias anidadas dentro de su campo de control mientras la variable o parámetro de control sea verdadera/o. El valor de la variable o parámetro de control se evalúa al principio del bucle antes de ejecutar las sentencias. Si el resultado de la evaluación es falso la primera vez que se entra en el bucle no se ejecutará ninguna sentencia. Como con la estructura if, se pueden anidar varias sentencias dentro del bucle while con llaves o bien con la forma alternativa: <?php $i = 1; while ($i <= 10): echo $i; $i++; endwhile; ?>

ó bien mediante llaves: <?php $i = 1; while ($i <= 10) { echo $i++; } ?>

Programación

Arturo Ruvalcaba


40

Capítulo 7 Estructuras de control

Referencias: •

(C) PHP Documentation Group while (http://es.php.net/manual/es/print/controlstructures.while.php)

do ... while Los bucles do ... while son similares a los bucles while salvo que las condiciones de repetición del bucle son comprobadas al final del bucle en lugar de al principio. La diferencia principal es que se garantiza la ejecución del bucle al menos una vez. Existe una sola sintaxis para los bucles do ... while. <?php $i = 0; do { print $i; } while ($i>0); ?>

En el ejemplo de arriba, el bucle sólo se ejecutará una vez ya que cuando se comprueba la condición, ésta resulta ser falsa: $i es igual a '0' y no mayor que '0' <?php $i = 10; do { print $i; $i--; } while ($i>0); ?>

Este script sí que nos haría una cuenta atrás de 10 a 1. Referencias: •

(C) PHP Documentation Group do ... while (http://es.php.net/manual/es/print/controlstructures.do.while.php)

for La estructura de control de flujo for corresponde al para de pseudocódigo y está controlada por tres parámetros, uno de comienzo, uno de fin y uno de paso incremental.

Programación

Arturo Ruvalcaba


Capítulo 7 Estructuras de control

41

for (expresión1; expresión2; expresión3) sentencia

La primera expresión ('expresión1') se evalúa incondicionalmente una vez al principio del bucle. Al comienzo de cada iteración, se evalúa 'expresión2'. Si es evaluada como VERDADERA el bucle continúa y las sentencias anidadas se ejecutan. Si es evaluada como FALSA la ejecución del bucle finaliza. Al final de cada iteración, se evalúa 'expresión3'. Cada una de las expresiones puede estar vacía. Que 'expresión2' esté vacía significa que el bucle debería correr indefinidamente (PHP implícitamente lo considera como VERDADERA, al igual que C). Esto puede que no ser tan inútil como podría pensarse, puesto que a menudo se quiere salir de un bucle usando una sentencia break condicional en vez de usar la condición de for. Ejemplo típico de estructura for: <?php for ($contador=0; $contador<10; $contador++){ echo "<br>numero $contador; <br>"; } ?>

Con la estructura anterior se pasa por todos los números del 0 al 9, si se quiere incluir el 10 se cambia el menor_que por un menor_que o igual_que: for ($contador=0; $contador<10; $contador++){

por for ($contador=0; $contador<=10; $contador++){

En función de las necesidades del script se cambian los incrementos por decrementos, los mayores_que por menores_que o iguales, etc. La forma alternativa de declarar un bucle for es la siguiente: <?php for ($contador=0; $contador<10; $contador++): echo "<br>numero $contador; <br>"; endfor; ?>

Aunque hay que procurar usar la forma de declarar con llaves ya que está más extendida y en un código amplio las llaves ayudan mucho a identificar los bucles.

Programación

Arturo Ruvalcaba


42

Capítulo 7 Estructuras de control

Referencias: •

(C) PHP Documentation Group for (http://es.php.net/manual/es/print/controlstructures.for.php)

foreach La instrucción foreach es un método construido específicamente para operar sobre matrices y vectores, esto facilita mucho la utilización de este tipo de variables. La sentencia devuelve un error si se usa sobre cualquier tipo de datos que no sean matrices o vectores. Hay dos posibles sintaxis para foreach: foreach(expresion_vector as $valor) sentencia foreach(expresion_vector as $llave => $valor) sentencia

Cada una de las sintaxis recorre uno a uno los elementos que forman el array dado por expresion_vector. En cada iteración, el valor almacenado en expresion_vector se asigna a $valor, de forma que al finalizar el bucle todos los elementos de expresion_vector quedará almacenado en $valor. La segunda sintaxis hace lo mismo, salvo que solamente asignará la clave del elemento que esté recorriendo en ese momento en la variable $llave. Cuando nos referimos a la clave del elemento estamos haciendo referencia a un array multidimensional en el que los elementos almacenados están especificados en distintos campos. Esto resulta muy útil cuando almacenamos elementos en un array que tienen distintos parámetros que interesan ser referenciados de forma distinta (un buen ejemplo sería una agenda telefónica en el que podríamos distinguir la clave nombre y la clave teléfono). Cuando foreach comienza por primera vez a ejecutarse, el puntero interno a la matriz o vector se reinicia automáticamente al primer elemento de la matriz. Esto hace que no sea necesario llamar a reset() antes de un bucle foreach. La estructura foreach trabaja con una copia de la matriz y no con ella en sí, por eso el puntero de la lista no se modifica a diferencia de la estructura each(), además los cambios en el elemento de la matriz devuelto no afectan a la matriz original. Ejemplo de uso de foreach: <?php $vector = array("uno", "dos", "tres"); //ejemplo con while reset ($vector); while (list(, $valor) = each ($vector)) { echo "Valor: $valor<br>"; } //ejemplo con foreach

Programación

Arturo Ruvalcaba


Capítulo 7 Estructuras de control

43

foreach ($vector as $valor) { echo "Valor: $valor<br>"; } ?>

En este ejemplo los dos scripts hacen lo mismo, pero como vemos es más sencillo el implementado con foreach ya que no tenemos que acordarnos de resetear el vector. Otros ejemplos más completos de foreach: <?php // foreach ejemplo 1: sólo valor $a = array(1, 2, 3, 17); foreach($a as $v) { echo "Valor actual de \$a: $v.<br>"; } ?> <?php // foreach ejemplo 2: valor (con clave impresa para mostrar) $a = array(1, 2, 3, 17); $i = 0; // sólo para propósitos demostrativos foreach($a as $v) { echo "\$a[$i] => $v.<br>"; $i++; } ?> <?php // foreach ejemplo 3: clave y valor $a = array( "uno" => 1, "dos" => 2, "tres" => 3, "diecisiete" => 17 );

Programación

Arturo Ruvalcaba


44

Capítulo 7 Estructuras de control

foreach($a as $k => $v) { echo "\$a[$k] => $v.<br>"; } ?> <?php // foreach ejemplo 4: matriz multi-dimensional $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<br>"; } } ?> <?php // foreach ejemplo 5: matriz dinámica foreach(array(1, 2, 3, 4, 5) as $v) { echo "$v <br>"; } ?>

Referencias: •

(C) PHP Documentation Group foreach (http://es.php.net/manual/es/controlstructures.foreach.php)

break La sentencia break hace que se finalice una estructura de control, sólo es aplicable en bucles for, while, o switch. Acepta un parámetro opcional, el cual determina de cuantas estructuras de control hay que escapar. Ejemplo de uso de break: <?php $i = 0;

Programación

Arturo Ruvalcaba


45

Capítulo 7 Estructuras de control

while (++$i) { switch ($i) { case 5: echo "Alto 5<br>"; break 1; // Salir sólo del switch case 10: echo "Alto 10; saliendo<br>"; break 2; // Salir del bucle switch y del while default: break; } } ?>

Al ejecutar este script veremos que se para en los valores "5" y "10". Si queremos comprobar todos los valores sólo tendremos que introducir una pequeña modificación al script entre el while y el switch: while (++$i) { echo "<b>$i</b><br>"; switch ($i) {

La mayoría de las veces break se utiliza junto con switch y sin el parámetro opcional. Referencias: •

(C) PHP Documentation Group break (http://es.php.net/manual/es/print/controlstructures.break.php)

continue La sentencia continue se usa dentro de la estructura de un bucle para saltar el resto de la iteración actual del bucle y continuar la ejecución al comienzo de la siguiente iteración. Hay que tener en cuenta que en PHP switch es considerada como una estructura de bucle por continue. continue acepta un parámetro opcional, el cual determina cuantos niveles (bluces) hay que saltar antes de continuar con la ejecución. <?php $i = 0; while ($i++ < 5) {

Programación

Arturo Ruvalcaba


Capítulo 7 Estructuras de control

46

echo "$i<br>"; echo "Fuera<br>"; while (1) { echo " En el medio<br>"; while (1) { echo " Dentro<br>"; continue 3; } echo "Esto nunca se imprime.<br>"; } echo "Y esto tampoco.<br>"; } ?>

En bucle while que tienen un "1" dentro, es equivalente a poner TRUE y se refiere a la expresión del primer 'while', ser menor que 5, si cambiamos el "1" por un "0" lo que pasaría es que no se ejecutaría ninguno de los dos bucles y sí los dos echo(s) que están debajo. Realmente la estructura continue se usa muy poco en scripts normales o de programadores noveles. Referencias: •

(C) PHP Documentation Group continue (http://es.php.net/manual/es/print/controlstructures.continue.php)

switch La sentencia switch es equivalente a una serie de sentencias if en la misma expresión. En muchas ocasiones se quiere comparar la misma variable (o expresión) con muchos valores diferentes, y ejecutar una parte de código distinta dependiendo de a qué valor es igual. Para ello sirve la sentencia switch. Es importante entender cómo se ejecuta la sentencia switch para evitar errores. La sentencia switch ejecuta línea por línea (realmente, sentencia a sentencia). Al comienzo, no se ejecuta código. Sólo cuando se encuentra una sentencia case con un valor que coincide con el valor de la expresión switch PHP comienza a ejecutar las sentencias. PHP continúa ejecutando las sentencias hasta el final del bloque switch, o la primera vez que vea una sentencia break. Si no se escribe una sentencia break al final de una lista de sentencias case, PHP seguirá ejecutando las sentencias del siguiente case. Por ejemplo: <?php switch ($i) { case 0: echo "i es igual a 0<br>";

Programación

Arturo Ruvalcaba


47

Capítulo 7 Estructuras de control

case 1: echo "i es igual a 1<br>"; case 2: echo "i es igual a 2<br>"; } ?>

Aquí, si la variable $i es igual a '0', PHP ejecutaría todas las sentencias echo. Si la variable $i es igual a '1', PHP ejecutaría las últimas dos sentencias echo y sólo si $i es igual a '2', se obtendría la conducta 'esperada' y solamente se mostraría 'i es igual a 2'. Así, es importante no olvidar las sentencias break, incluso aunque pueda querer evitar escribirlas intencionadamente en ciertas circunstancias. En una sentencia switch, la condición se evalúa sólo una vez y el resultado se compara a cada sentencia case. En una sentencia elseif, la condición se evalúa otra vez. Si la condición es más complicada que una comparación simple y/o está en un bucle estrecho, un switch puede ser más rápido. La lista de sentencias de un case puede también estar vacía, lo cual simplemente pasa el control a la lista de sentencias del siguiente case. <?php switch ($i) { case 0: case 1: case 2: echo "i es menor que 3, pero no es negativo"; break; case 3: echo "i es 3"; } ?>

Un caso especial es el default case. Este case coincide con todo lo que no coincidan los otros case. Por ejemplo: <?php switch ($i) { case 0: echo "i es igual a 0"; break; case 1:

Programación

Arturo Ruvalcaba


48

Capítulo 7 Estructuras de control

echo "i es igual a 1"; break; case 2: echo "i es igual a 2"; break; default: echo "i es distinto de 0, 1 y 2"; } ?>

La expresión case puede ser cualquier expresión que se evalúe a un tipo simple, es decir, números enteros o en coma flotante y cadenas de texto. No se pueden usar aquí ni matrices/arrays/vectores ni objetos a menos que se conviertan a un tipo simple. También existe sintaxis alternativa para switch. <?php switch ($i): case 0: echo "i es igual 0"; break; case 1: echo "i es igual a 1"; break; case 2: echo "i es igual a 2"; break; default: echo "i es distinto de 0, 1 o 2"; endswitch; ?>

Referencias: • (C) PHP Documentation Group switch (http://es.php.net/manual/es/print/controlstructures.switch.php).

Programación

Arturo Ruvalcaba


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.