Control del flujo en PHP: Bucles I

Valoración del artículo:
Estructura y funcionamiento de los bucles while y do/while.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Los ordenadores, como cualquier máquina, están diseñados para realizar tareas repetitivas. Es por ello que nuestros programas pueden aprovecharse de este principio para realizar una determinada secuencia de instrucciones un cierto número de veces. Para ello, utilizamos las estructuras llamadas en bucle que nos ayudan a, usando unas pocas líneas, realizar una tarea incluida dentro del bucle un cierto numero de veces definido por nosotros mismos.

PHP propone varios tipos de bucle cada uno con características especificas:

Bucle while

Sin duda el bucle más utilizado y el más sencillo. Lo usamos para ejecutar las instrucciones contenidas en su interior siempre y cuando la condición definida sea verdadera. La estructura sintáctica es la siguiente.

while (condición)
{
   instruccion1;
   instruccion2;
   ...
}

Un ejemplo sencillo es este bucle que aumenta el tamaño de la fuente en una unidad a cada nueva vuelta por el bucle:

<?
$size=1;
While ($size<=6)
{
   echo"<font size=$size>Tamaño $size</font><br>\n";
   $size++;
}
?>

A modo de explicación, diremos que, antes de nada, hemos de definir el valor de la variable que vamos a evaluar en la condición. Algo absolutamente obvio pero fácil de olvidar. En este caso le hemos atribuido un valor de 1 que corresponde a la letra más pequeña.

El paso siguiente es crear el bucle en el que imponemos la condición que la variable no exceda el valor de 6.

La instrucción a ejecutar será imprimir en nuestro documento un código HTML en el que la etiqueta font y el mensaje que contiene varían a medida que $size cambia su valor.

El siguiente paso es incrementar en una unidad el valor de $size. Esto se puede hacer con una expresión como la mostrada en el bucle ($size++) que en realidad es sinónima de:

$size=$size+1

Veremos otras de estas abreviaciones más adelante.

Otro ejemplo del buble While

El bucle while se suele utiliza cuando no se sabe exactamente cuantas iteraciones se deben realizar antes de acabar. Vamos a utilizarlo en otro ejemplo, en el que hay que recorrer una cadena hasta encontrar un carácter dado. Si lo encuentra, escribir su posición. Si no, escribir que no se ha encontrado.

Nota: Para hacer este ejercicio necesitamos conocer la función de cadena strlen(), que obtiene la longitud de la cadena que se le pase por parámetro.

int strlen (string cad)
Devuelve un entero igual a la longitud de la cadena.

<?
$cadena = "hola a todo el mundo";

//recorro la cadena hasta encontrar una "m"
$i=0;
while ($cadena[$i]!="m" && $i< strlen($cadena)){
    $i++;
}

if ($i==strlen($cadena))
    echo "No se encuentra...";
else
    echo "Está en la posición $i";
?>

En este ejemplo se define una cadena con el valor "hola a todo el mundo". Posteriormente se recorre esa cadena hasta el final de la cadena o hasta encontrar el caracter "m", utilizando una variable $i que lleva la cuenta de los caracteres recorridos.

Al final del bucle while, si se salió porque se encontró el caracter "m", la variable $i valdrá un número menor que la longitud de la cadema. Si se salió por llegar al final de la cadena, la variable $i valdrá lo mismo que la longitud en caracteres de esa cadena. En el condicional simplemente se comprueba si $i vale o no lo mismo que la longitud de la cadena, mostrando los mensajes adecuados en cada caso.

Podemos ver el ejemplo en funcionamiento.

Bucle do/while

Este tipo de bucle no difiere en exceso del anterior. La sintaxis es la siguiente:

do
{
   instruccion1;
   instruccion2;
   ...
}
while (condición)

La diferencia con respecto a los bucles while es que este tipo de bucle evalúa la condición al final con lo que, incluso siendo falsa desde el principio, éste se ejecuta al menos una vez.

Comentarios
Fueron enviados 10 comentarios al artículo
4 comentarios no revisados
6 comentarios revisados:
Por: Dani D
15/3/05
El ejemplo del recorrido de la cadena buscando el caracter "m" tiene un pequeño fallo.

Las condiciones en el bucle while deberian estar al reves, esto es:

while ($i< strlen($cadena) && $cadena[$i]!="m") Esto es asi debido a que si el caracter no se encuentra en la cadena, en el ejemplo original se produciria un acceso indebido en la variable $cadena, intentando referenciar una posicion mas alla del total.

Ahora, con las condiciones cambiadas, se comprueba primero si el contador sobrepasa la longitud de la cadena, evitando asi el acceso indebido.

Hay de recordar de todas formas que este ultimo metodo es posible gracias a que PHP (y el lenguaje C) poseen lo que se denomina "evaluacion en cortocircuito", que consiste en dejar de evaluar una serie de condiciones logicas si ya esta claro que no va a poder cumplirse la condicion global.
Por: BRIO
30/6/05
Hola, el ejemplo está bien ;)

Aqui no importa el orden de los factcores, ya que al estar en corto circuito (&&) obliga a que las 2 condiciones se tienen que cumplir, de hecho puedes probar el ejemplo y no sale error alguno.
saludos
Por: Yordanis
06/12/05
Lo que plantea Dani D es correcto, pero el algoritmo sí funciona correctamente, lo que sucede es que en caso de no encontrarse el carácter no se está accediendo a memoria indebida, pues las cadenas guardan un carácter adicional (el nulo), que es realmente el último carácter.
Por: Moran jr
20/12/05
Hola, el primer comentario tiene razón. Intercambiando de posición las condiciones se evita el error que se produce cuando no encuentra el caracter que le indicamos. Salu2
Por: geek
14/3/06
sobre cortocircuito.


a ver lo que aqui se explica es una optimizacion del lenguaje que consiste en una evaluacion perezosa, imaginemos que hacemos el bucle while a mano y que pasadas x iteraciones descubrimos que la primera expresion, equivale a falso, el lenguaje no evalua la segunda si y solo si las dos expresiones (o tres o mas) van unidas por un and logico esto es:

while ($i < 3 && $i =! (1/2$x)/1^-$x)
en el momento que $i tome un valor cuatro la otra expresion no se evalua ya que de todas maneras falso y ciero o falso y falso siempre va a dar falso.

como ya conocemos de antemano que la totalidad de la expresion va a dar falso, pq seguir calculando (tontamente)
Por: Sebastian
30/3/06
El codigo esta bien, no va a hacer un ingreso indebido, pero seria optimo en la utilizacion de recursos (aunque sea minima) que la comprobacion de haber llegado al final de la cadena se haga primera. Por la razon que dio Dani sobre la evaluacion en cortocircuito.

Manuales relacionados
Categorias relacionadas
El autor
Rubén Alvarez
Redactor de DesarrolloWeb.com
http://www.desarrolloweb.com
Lectura recomendada
Últimas noticias
Alojados en el grupo