Ejercicios de bucles php, nivel intermedio y avanzado

Ejercicios de php para aprender a utilizar bucles. Si estás aprendiendo PHP o programación Web esta es tu página.

Bucles

Ejercicio 1

Enunciado del ejercicio 1

Estamos creado la web de una tienda online, en concreto, el código de un buscador de productos. Nos piden que creemos un script que solucione el problema de filtrado de productos, mostrando solo los productos que ha elegido filtrar el usuario.

La información de los productos la tenemos en un Array multidimensional llamado $arrayProductos, en posiciones consecutivas (0, 1, 2, 3) y en cada una un array con dos datos, la categoría del producto y el nombre del producto.

En la variable $categoria recibiremos el código de la categoria de productos a mostrar.

El array tendría un contenido SIMILAR al siguiente:

<?php
$array = array(
0 => array( 'categoria' => 33, 'nombre' => 'Zapatos lala' ),
1 => array( 'categoria' => 24, 'nombre' => 'Pantalones lolo' ),
2 => array( 'categoria' => 33, 'nombre' => 'Zapatos lulu' ),
3 => array( 'categoria' => 23, 'nombre' => 'Camiseta lili' ),
..............
);
?>

Ayuda:

  • Para saber el número de posiciones del array puedes utilizar la función sizeof () count().
  • Recuperar la posición de un array es tan fácil como indicar el nombre de la variable y la posición: $array[2]. Si la posición es un texto sería lo mismo: $array[2]['nombre']; 

 

Solución utilizando bucle FOR

<?php
$total_productos = sizeof( $arrayProductos );
for ( $i = 0; $i < $total_productos; $i++ ) {
$producto = $arrayProductos[$i];
if ( $producto['categoria'] == $categoria ) {
echo $productp['nombre'];
}
}
?>

Solución del ejercicio con bucle WHILE

<?php
$total_productos = sizeof( $arrayProductos );
$i = 0;
while ( $i < $total_productos ) {
$producto = $arrayProductos[$i];
if ( $producto['categoria'] == $categoria ) {
echo $productp['nombre'] . '<br>';
}
$i++;
}
?>

Este ejercicio se puede resolver con cualquier tipo de bucle, para las soluciones de estos ejercicios enfocados en el dominio del uso de los bucles he utilizado los bucles FOR y WHILE, los más sencillos.

Cuando planeamos la solución debemos responder a la pregunta de siempre ¿Cuántas iteraciones necesitará realizar el bucle? Tantas repeticiones como productos tenga el Array $arrayProductos. Las tres partes principales que componen en bucle serán:

  1. Inicialización: el contador, que lo hago coincidir con el inicio del Array, la posición 0.
  2. Condiciónmientras $i sea menor que la posición del último producto. Esto lo calculamos utilizando la función sizeof(), que nos devuelve el total de posiciones del arrayComo la posición del Array empieza en 0 la última será el total de productos menos 1.
  3. Actualizaciónlas posiciones son consecutivas, de uno en uno, así que incrementaré también en ese intervalo $i++.

Ahora queda saber si el producto que recorro en cada iteración lo debo mostrar o no. Para esto necesitamos comparar el valor de la categoría del producto con el valor del filtro $categoria. Entonces si $arrayProductos[$i]['categoria'] es igual a este valor imprimiré el nombre del producto por pantalla ( $producto['categoria'] == $categoria ).

Ejercicio 2

Enunciado del ejercicio 2

Continuando con el problema anterior, ahora nos piden hacer 2 cambios:

  1. Nos solicitan que mostremos la página requerida por el usuario. Por ejemplo, si han solicitado la página 2, debemos mostrar los productos del 10 al 19, es decir, cada página tiene 10 productos.
  2. Ya no es necesario filtrar la categoría.

El valor de la página solicitada lo tendremos disponible en la variable $pagina. El resto del ejercicio es igual que el anterior.

Solución utilizando bucle FOR

<?php
$total_productos = sizeof( $arrayProductos );
$posicion_inicial = ($pagina - 1) * 10;
$posicion_final = $posicion_inicial + 9;
for ( $i = $posicion_inicial; $i <= $posicion_final && $i < $total_productos; $i++ ) {
$producto = $arrayProductos[$i];
echo $productp['nombre'];
 
}
?>

Solución con bucle WHILE

<?php
$total_productos = sizeof( $arrayProductos );
$posicion_inicial = ($pagina - 1) * 10;
$posicion_final = $posicion_inicial + 9;
$i = $posicion_inicial;
while ( $i <= $posicion_final && $i < $total_productos ) {
$producto = $arrayProductos[$i];
echo $productp['nombre'] . '<br>';
$i++;
}
?>

La solución es básicamente la misma que en el ejercicio anterior, pero en esta, como nos dicen que debemos mostrar los productos de la página solicitada, debemos cambiar los valores del contador ($i). 

Como nos dicen en el ejemplo que si nos piden la página 2 mostraremos del 10 al 19, y las páginas son de 10 productos, vemos que 2 ($pagina) - 1 multiplicado por 10 (elementos por página) nos da 10 (primer producto a mostrar)El último producto a mostrar será la primera posición más 9. Las tres partes del bucle nos quedarán así:

  1. Inicialización: inicializo el contador al mismo valor de la posición inicial de la página. $i <= $posicion_final
  2. Condiciónmientras $i sea menor que la posición del último producto de la página Y sea menor que el total de productos. A pesar de que tengo que mostrar los productos de la página, hay que tener en cuenta que puede ser que el total de productos sea menor que la última posición de la página, es decir, la página está incompleta.
  3. Actualizaciónlas posiciones son consecutivas, de uno en uno, así que incrementaré también en ese intervalo $i++.

Ejercicio 3

Enunciado del ejercicio 3

La faena se nos complica, nuestro jefe de proyectos nos quiere poner a prueba y no pide cambios. Ahora al array anterior se le añade un nuevo campo por producto, el precio. Nos piden que realicemos el script capaz de ordenar de menor a mayor los productos por su precio.

El array tendría la misma estructura que el siguiente ejemplo:

<?php
$array = array(
0 => array( 'categoria' => 33, 'nombre' => 'Zapatos lala', 'precio' => 33.91 ),
1 => array( 'categoria' => 24, 'nombre' => 'Pantalones lolo', 'precio' => 45.95 ),
2 => array( 'categoria' => 33, 'nombre' => 'Zapatos lulu', 'precio' => 29.99 ),
3 => array( 'categoria' => 23, 'nombre' => 'Camiseta lili', 'precio' => 15.00 ),
..............
);
?>
 

Solución utilizando bucle FOR

<?php
$total_productos = sizeof( $arrayProductos );
for ( $i = 0; $i < $total_productos; $i++ ) {
//datos del producto que voy a ordenar 
$producto = $arrayProductos[$i];
$posicionArray = $i;
for( $j = $i; $j < $total_productos; $j++ ){
$precioProducto2 = $arrayProductos[$j]['precio'];
if ( $precioProducto2 < $producto['precio'] ){
//si el precio del producto es menor que el precio que estoy ordenando me guardo los datos
$producto = $arrayProductos[$j];
$posicionArray = $j;
}
}
//intercambiamos las posiciones
$arrayProductos[$posicionArray] = $arrayProductos[$i];
$arrayProductos[$i] = $producto;
 
 
}
?>

Solución del ejercicio con bucle WHILE

<?php
$total_productos = sizeof( $arrayProductos );
$i = 0;
while ( $i < $total_productos ) {
//datos del producto que voy a ordenar
$producto = $arrayProductos[$i];
$posicionArray = $i;
$j = $i;
while( $j < $total_productos){
$precioProducto2 = $arrayProductos[$j]['precio'];
if ( $precioProducto2 < $producto['precio'] ){
//si el precio del producto es menor que el precio que estoy ordenando me guardo los datos
$producto = $arrayProductos[$j];
$posicionArray = $j;
}
$j++;
}
//intercambiamos las posiciones
$arrayProductos[$posicionArray] = $arrayProductos[$i];
$arrayProductos[$i] = $producto;
$i++; 
}
?>

Resolver este ejercicio requiere anidar dos bucles: el primer bucle recorrerá posición por posición el array para que el segundo, anidado, compare el precio con todos los demás, buscando el más barato desde la posición $i hasta el final $total_productos - 1.  Los dos bucles quedan por tanto así:

  1. Bucle 1: recorre las posiciones de 1 en 1 decidiendo que producto voy a ordenar.
  2. Bucle 2 (el anidado):  su contador empieza en el contador del bucle padre ¿Por qué? Porque debemos comparar el precio del producto a ordenar ($i) con los siguientes, nunca los anteriores, ya que ya están ordenados. 

Además de tener claro el planteamiento básico de la necesidad de dos bucles, debemos pensar como vamos a trabajar con las posiciones del Array. Existen varias soluciones para el ejercicio, guardando los valores de distinta forma, pero la lógica es la misma.

En mis soluciones, guardo toda la información del producto que tiene el menor precio de los que quedan por comprobar en la variable $producto. Cuando en el segundo bucle encuentro un producto de menor precio if ( $precioProducto2 < $producto['precio'] ) guardo dos datos:

  • La posición del array de este producto para intercambiarlo con el de $arrayProductos[$i];
  • La información completa del producto en $producto 

Cuando termino la búsqueda del más barato en el bucle anidado, lo primero que tengo que hacer es intercambiar los valores de las dos posiciones $posicionArray y $i.

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.