You are on page 1of 21

5.

Sentencias de control
5.1. Operador if 5.2. Funcin switch 5.3. Bucles 5.3.1. while 5.3.2. do while 5.3.3. for 5.3.4. foreach 5.3.5 Funciones continue

ESTRUCTURAS DE CONTROL

Las instrucciones se ejecutan una tras otra en el orden que se escriben. Ejecucin secuencial. Existen instrucciones que permiten especificar que la siguiente instruccin podra ser distinta a la que sigue en la secuencia. Transferencia de control. Todos los programas pueden escribirse en trminos de 3 instrucciones de control. Teorema de la programacin estructurada.

Secuencial Ejecucin por defecto de las sentencias en C Seleccin C tiene 3 tipos: if, if/else y switch Repeticin Bucles, C tiene 4 tipos: while, do/while, for y foreach

5.1. Operador if
Operadores condicionales Este tipo de operadores son el autntico cerebro de cualquier aplicacin que desarrollemos en PHP o en cualquier otro lenguaje de programacin. Los operadores condicionales son la herramienta que permite tomar decisiones tales como: hacer o no hacer, y tambin: hacer algo bajo determinadas condiciones y otra cosa distinta en caso de que no se cumplan. Condiciones Aunque para simplificar los ejemplos vamos a utilizar en ellos una sola condicin, este operador permite incluir como tal cualquier estructura lgica, del tipo que hemos visto en la pgina anterior, por compleja que esta sea.

Alternativas de sintaxis Como iremos viendo a lo largo de estas lneas, este operador permite diferentes formas de sintaxis que podemos utilizar segn nuestra conveniencia. La forma ms simple es: if(condicin) Ejemplo24.php ..instruccin... ; Si se cumple la condicin establecida en el parntesis se ejecutar la primera instruccin que se incluya a continuacin de ella. Cualquier otra instruccin que hubiera a continuacin de esa primera no estara afectada por el condicional y se ejecutara en cualquier circunstancia. Observa que, aunque hemos puesto if(condicin) en una lnea independiente, no lleva punto y coma detrs. if(condicin){ ..instruccin 1... ; ..instruccin 2... ; .... ; } Es una ampliacin del caso anterior. Cuando es necesario que en caso de que se cumpla la condicin o condiciones se ejecute ms de una instruccin, se aade una { para indicar que habr varias instrucciones, se escriben estas y mediante } se seala el final. if(condicin) : ..instruccin 1... ; Ejemplo25.php ..instruccin 2... ; .... ; endif; Esta otra forma del condicional se comporta como la anterior pero con otra sintaxis. Se sustituye la { de apertura por : y la } de cierre por endif

if(condicion){ ?> ..Etiquetas HTML... ; ..HTML... ; Ejemplo26.php .... ; <? } ?> PHP permite la utilizacin del operador condicional if con esta sintaxis. Una primer script PHP establece la condicin. Todo lo contenido entre ese primer script y el de cierre: <?}?> ser cdigo HTML (est fuera del script), que se insertar en el documento slo en el caso de que se cumpla la condicin. if(condicion) : ?> ..Etiquetas HTML... ; ..HTML... ; .... ; <? endif; ?> Idntica a la anterior, con la sintaxis : , endif. If ... else El operador condicional tiene una interesante ampliacin. En conjuncin con else permite aadir instrucciones que slo seran ejecutadas en caso de no cumplirse la condicin. Esta nueva opcin se habilita mediante la siguiente sintaxis:
if(condicion){ ... instrucciones... ... a ejecutar cuando se cumple la condicin } else { ... instrucciones... ... a ejecutar cuando NO se cumple la condicin }

Ejemplo27.php

permitiendo tambin la sintaxis alternativa :, endif, aunque en este caso hay que hacer una precisin -puedes verla aqu debajo la llave de cierre que iba delante de else se elimina y no es sustituida por ningn caracter ni smbolo especial.

<?if(condicion): ?> ... cdigo HTML ... a ejecutar cuando Ejemplo28.php se cumple la condicin <? else: ?> ... codigo HTML... ... a ejecutar cuando NO se cumple la condicin <? endif; ?> En algunos casos resulta til y cmodo el uso de esta otra posibilidad de sintaxis: (condicin) ? (opc1) : (opc2) Si se cumple la condicin se ejecuta la opc1, pero en el caso de que no se cumpla se ejecutar la opc2.

Ejemplo29.php

Ejemplo30.php

If ... elseif .. else Otra posibilidad dentro de la estructura de los operadores condicionales es la inclusin de elseif. Esta es la sintaxis. (Dentro de ella tienes los comentarios explicativos). if(condicion1){ ... instrucciones... ... a ejecutar cuando Ejemplo31.php Ejemplo32.php se cumple la condicin1 }elseif(condicion2){ ... instrucciones... ... a ejecutar cuando Ejemplo33.php Ejemplo34.php se cumple la condicin2 sin cumplirse condicin1 } else { ... instrucciones... ... a ejecutar cuando NO se cumple ni la condicin1 ni la condicion2 }

Condicionales anidados El anidado no es otra cosa que el equivalente a los parntesis dentro de parntesis en las matemticas. Y este operador lo permite, con una nica condicin, que vers en esta muestra de sintaxis. if(condicin1){ ... instrucciones... if(condicin2){ ... instrucciones... } else { ...instrucciones } }else{ ... instrucciones... ...instrucciones... } Observa que todo el bloque if.. else... marcado en azul se cierra antes de abrir la opcin else marcada en marrn. Es obligatorio que as sea. De igual forma, podramos insertar bloques sucesivos hasta llegar a crear una estructura tan amplia como fuera necesaria. Como ves, todo un mundo de posibilidades.

Ejemplo:

Dados tres nmeros, indicar cual es el mayor.

Estructuras1 a Estructuras6

La funcin exit()
PHP dispone de una funcin exit() muy til a los efectos del comentario anterior. Cuando se ejecuta exit() se interrumpe la ejecucin del script con lo que la respuesta del servidor a la peticin del cliente incluir nicamente los contenidos generados antes de su ejecucin.

5.2. Funcin switch


Una alternativa al uso de condicionales del tipo if es la funcin switch. Se trata de un condicional que evala una variable y, segn su valor, ejecuta unas instrucciones u otras. Su sintaxis es la siguiente:
switch ( variable ) { case n1: instrucciones caso n1... ..................... case n2: instrucciones caso n2... ..................... }

Cuando se usa esta sintaxis slo se ejecutan aquellas instrucciones que han sido incluidas a partir de la etiqueta en la que el nmero que sigue a case coincide con el valor de la variable. La forma ms habitual de uso de esta funcin es esta:
switch ( variable ) { case n1: instrucciones caso n1... ..................... break; case n2: instrucciones caso n2... ..................... break; }

Esta opcin incluye antes de cada nuevo case la funcin de ruptura break. Cuando PHP encuentra el break interrumpe la ejecucin y no la reanuda hasta la instruccin siguiente a la } que cierra la funcin switch. Insertando break en cada una de las opciones case, slo se ejecutaran las instrucciones contenidas entre case num y ese break.

default: Bajo este nombre (default:) se pueden incluir dentro de la funcin switch un conjunto de instrucciones que solo sern ejecutadas en el caso que el valor de la variable no coincida con ninguno de los case. Su comportamiento es equivalente a else en el condicional if.

Ejemplo36.php y ejemeplo37.php

5.3. Bucles
La necesidad de repetir la ejecucin de instrucciones es algo habitual en el mundo de la programacin. Frente a la alternativa poco prctica de rescribir esas instrucciones todos los lenguajes de programacin disponen de funciones que pueden ejecutar un bloque de instrucciones de forma repetitiva

La instruccin while
Como ocurra en el caso de if, el parmetro condicin permite cualquier estructura lgica, y tambin dispone de distintas opciones de sintaxis.
while(condicin) ...instruccin

Con esta sintaxis estaremos indicando que la instruccin siguiente (slo una instruccin) ha de ejecutarse continua y repetidamente hasta que deje de cumplirse la condicin establecida.
while(condicin){ ...instruccin ..... }

De forma similar a la utilizada en el caso de if, tambin en este caso, las llaves hacen la funcin de contenedores de las instrucciones cuya ejecucin debe repetirse mientras se cumpla la condicin.
while(condicin): ...instruccin ..... endwhile;

Tambin aqu se mantiene la similitud con la sintaxis del condicional if. La llave ({) pueden sustituirse por (:) y en este caso en vez de (}) habra que escribir endwhile.
while(condicin) : ?> ...etiquetas HTML ..... <? endwhile; ?>

Tambin while permite cerrar el script PHP despus de (:) o de la sintaxis alternativa ({) e insertar etiquetas HTML, indicando ms tarde el final del bucle con <? } ?> o <? endwhile; ?>, segn proceda.

While anidados Una nueva similitud sintctica con if. En el caso de while tambin es posible insertar un while dentro de otro while utilizando una sintaxis de este tipo: while(condicin1): ...instruccin while(condicin2) { ...instruccin ..... }..... endwhile; En esta descripcin hemos utilizado dos sintaxis distintas. Por si acaso dudaras de si es necesario o no hacerlo de esa forma, te diremos que no es necesario nunca. El hecho de la anidacin no limita un pice las posibilidades de la sintaxis.

Ejemplos 38 a 40

El bucle do while
Estamos ante una variante del bucle while que hemos visto en la pgina anterior. La sintaxis es la siguiente: do { ..intruccin 1... .... instruccion2... } while(condicin) ; Se diferencia de while en que en este caso se comprueba la condicin despus de haber ejecutado las instrucciones contenidas en el bucle, con lo cual, en el caso de que desde el comienzo no se cumplieran las condiciones establecidas en while, las instrucciones del bucle se ejecutaran una vez. Respecto a la sintaxis, como puedes observar, detrs de do se inserta una llave ({) que seala el comienzo de las instrucciones pertenecientes al bucle. El final de esas instrucciones lo seala la otra llave (}) que precede a while(condicin). break La funcin break de forma similar a lo que ocurra en switch permite interrumpir la ejecucin de bucle. Tal como puede verse en el ejemplo, podra entre otras posibilidades utilizarse para evitar la primera ejecucin de las instrucciones contenidas en el bucle, en el caso de que, desde un primer momento, no se cumplieran las condiciones establecidas en while.

Ejemplo 42 a 44

El bucle for
Se trata de una nueva forma de uso bastante habitual que permite establecer un bucle que se repetir mientras una variable numrica se mantenga dentro de intervalo -establecido en la sintaxis del propio bucle indicndose, tambin en la propia instruccin, el criterio de modificacin de esa variable en cada ejecucin del bucle. La sintaxis es la siguiente: for ( desde ; hasta ; incre ){ ......... ...instrucciones.... ......... } El parmetro desde permite asignar un valor inicial a una variable ($var=num) que har funciones de controladora de iteraciones. El parmetro hasta establece la condicin que limita el valor mximo que puede alcanzar la variable de control. El parmetro incre (con una sintaxis del tipo $variable++; $variable--; ++$variable --$variable; $variable +=n o $variable -=n establece los incrementos o decrementos de la variable controladora en cada iteracin del bucle. Las intrucciones contenidas entre { } sern ejecutadas cada vez que se reitere el bucle.

ejemplo46

Variantes del bucle for El bucle for permite algunas variantes respecto a su forma ms general. Son estas: for ( desde ; ; incre ){ ......... ...instrucciones.... ......... } En este caso se omite el valor del parmetro hasta (observa que no se omite el separador de parmetros (;) con lo que en realidad se est asignando a hasta el valor NUL. Cuando se utiliza esta sintaxis, el bucle se repetira de forma indefinida (la variable podra tomar cero como valor, pero, cero es distinto de NUL) salvo que -tal como puedes ver en el ejemplo- se escriba en las instrucciones un operador condicional con una opcin de ruptura del bucle -el famoso break que ya hemos visto al estudiar la instruccin while y otras anteriores. for ( ; ; ){ ......... ...instrucciones.... ......... } En este caso no se inserta ningn parmetro pero si se escriben los ; delimitadores de los mismos. Si observas el ejemplo vers que el control se realiza fuera del for. El valor de la variable contador se asigna fuera del bucle, los incrementos de esa variable estn escritos en las lneas de instrucciones y llevan un operador condicional con la funcin break para permitir la salida. for( desd ; hast ; inst, incr ) Esta nueva variante de for permite insertar instrucciones a travs del tercer parmetro de la funcin. Si insertamos como tercer parmetro una conjunto de instrucciones, separadas por comas, se ejecutarn de igual forma que si estuvieran contenidas entre { y } En este caso, el modificador de la variable de control (incr) se incluye como una instruccin ms separada por una coma de las contenidas en ese tercer parmetro de la funcin. for ( desde ; hasta ; incre ): ......... ...instrucciones.... ......... endfor; Esta sintaxis es alternativa a la primera de las descritas. Sustituye la { por dos puntos (:) y la } por endfor.2

Ejemplo 45 a 50

El bucle foreach
El bucle foreach es especfico de los array y aplicable a ellos tanto si son escalares como si son de tipo asociativo. Tiene dos posibles opciones. En una de ellas lee nicamente los valores contenidos en cada elemento del array. En el otro caso lee adems los ndices del array. Lectura de valores Utiliza la sintaxis: foreach( array as var ){ ...instrucciones... } donde array es el nombre del array (sin incluir ndices ni corchetes), as es una palabra obligatoria y var el nombre de una variable (puede ser creada al escribir la instruccin ya que no requiere estar previamente definida). Las instrucciones escritas entre las { } permiten el tratamiento o visualizacin de los valores obtenidos. La variable var no podr ser utilizada para guardar valores. Hemos de tener en cuenta que su valor se rescribe en cada iteracin del bucle y que al acabar este slo contendr el ltimo de los valores ledos. Lectura de ndices y valores Con una sintaxis como la que sigue se pueden leer no slo los valores de un array sino tambin sus ndices. foreach( array as v1 => v2 ) { ...instrucciones... } donde array es el nombre de la matriz, as es una palabra obligatoria, v1 es el nombre de la variable que recogern los ndices, los caracteres => (son obligatorios) son el separador entre ambas variables y, por ltimo, v2 es el nombre de la variable que recoge el valor de cada uno de los elementos del array. Tanto esta funcin como la anterior realizan una lectura secuencial que comienza en el primer valor delarray.

La instruccin continue
Si la instruccin break permite interrumpir el desarrollo de un bucle, mediante continue se puede impedir que, bajo unas condiciones determinadas, se ejecuten algunas o todas las instrucciones de un bucle sin que por ello se interrumpa la ejecucin de las iteraciones siguientes. Esta instruccin es aplicable tanto a bucles for como a los de tipo while o do while. Seguramente los ejemplos nos ayudarn a aclarar un poquito ms la idea. En todos ellos hay un condicional que contiene la funcin continue. El primero de ellos (un bucle for) tiene como condicin: $i % 2 == 0, que, como recordars, significa que el resto de la divisin de $i entre dos($i % 2) sea igual (==) a cero. En este supuesto (condicin de mltiplo de dos) se activar la opcin continue y por lo tanto en esa iteracin no se ejecuta la instruccin echo o, lo que es lo mismo, no se imprimirn en pantalla los mltiplos de 2. En el segundo ejemplo (caso de bucle while) la condicin establecida para que se ejecute continue es que el valor de la variable no sea mltiplo de tres, en cuyo caso echo slo imprimir los mltiplos de3. El tercer ejemplo utiliza un bucle do ... while para presentar en pantalla los mltiplos de 11.

Ejemplos 53 a 55

La instruccin continue n La instruccin continue puede utilizar un parmetro n con valor entero positivo que cuando no se indica toma por defecto el valor 1. La idea es la siguiente. Cuando tenemos bucles anidados el intrprete de PHP los considera numerados correlativamente de dentro hacia fuera a partir de UNO. Cuando es ejecutada continue n se redirecciona la iteracin al bucle, cuyo nmero coincide con el valor de n. Obviamente, el valor de n no puede ser nunca mayor que el nmero de bucles anidados en el script. Analicemos los ejemplos caso continue1, 2 y 3: En el primer caso el bucle for sera el UNO y el while sera el DOS. Cuando se cumpla la condicin que activa continue 2, se redirecciona la iteracin al paso siguiente del bucle DOS, en el caso del ejemplo al paso siguiente de while. En el segundo ejemplo, como puedes ver, hemos anidado a tres niveles y hemos escrito continue 3, aunque a la hora de ejecutar los ejemplos podrs ver las tres variantes posibles de ese script modificando los valores del n de continue. Fjate en un matiz importante. Cuando el intrprete lee la instruccin for por primera vez lo hace a partir del valor inicial de la variable que controla las iteraciones, pero ni do... while ni while tienen esa opcin dado que por s mismos no modifican las variables de control. Estos trabajan con condiciones mientras que for lo hacen con su variable de control. Esa es la razn por la que en los ejemplos de los casos continue 1 y continue 2 la variable k no pasa del valor 0, ya que al sobrepasar j el valor 5, el bucle while no se ejecuta. Si quieres que esas variables se reinicien al modo de for tendrs que aadir dentro del if que contiene el continue correspondiente y antes de continue una lnea donde asignes a esas variables su valor inicial.