A practicar

A practicar con las funciones

A practicar Desarrollo

En el reto anterior queríamos empezar a manejar una pequeña agenda semanal en la que, en base a unas actividades que definíamos nosotros, el programa nos mostraba un par de consultas. Vamos a ello antes de ponernos de lleno en el reto actual donde utilizaremos el mismo programa para practicar con las funciones.

Solución al reto anterior

Como decíamos, buscábamos crear una pequeña agenda semana. En primer lugar, el reto nos pedía la construcción de un array con la agenda de actividades semanal, guardando el nombre de cada día y, dentro de ellos, guardando las actividades de ese día, las cuales tendrían hora y descripción. Vayamos a ver primero a definir nuestro array de días de la semana.

Definiendo los días de la semana

<?php

$agenda_diaria = array(
	'lunes',
	'martes',
	'miercoles',
	'jueves',
	'viernes',
	'sabado',
	'domingo'
);

?>

Tenemos nuestro array, de nombre $agenda_diaria con los siete días de la semana escritos textualmente. Pero queremos que cada día tenga, en realidad, varias actividades. Para ello, vamos a transformar esos días en el índice de nuevos arrays con las actividades de cada día, aún sin definir.

Preparando para ampliar los días

<?php

$agenda_diaria = array(
	'lunes' => array(),
	'martes' => array(),
	'miercoles' => array(),
	'jueves' => array(),
	'viernes' => array(),
	'sabado' => array(),
	'domingo' => array()
);

?>

Vamos definiendo poco a poco nuestro array. Ahora tenemos un array, $agenda_diaria, que tiene siete arrays vacíos definidos. Es decir, es un array multidimensional, aunque todos los arrays internos no tengan nada. Nuestros días han pasado a ser de elementos a índices de esos nuevos arrays que contendrán nuestras actividades.

Ahora vamos a llenar esos arrays diarios con las actividades. Se nos pidió que las actividades tuvieran hora y descripción, así pues, definiremos nuevos arrays dentro de esos arrays de cada día. Verlo es más sencillo que leerlo:

Añadiendo las actividades diarias

<?php

$agenda_diaria = array(
	'lunes' => array(
		array(
			'hora' => '9:35',
			'descripcion' => 'Visita al médico'
		),
		array(
			'hora' => '12:00',
			'descripcion' => 'Clase de inglés'
		)
	),
	'martes' => array(
		array(
			'hora' => '10:00',
			'descripcion' => 'He quedado con Nerea y David para hacer un trabajo'
		),
		array(
			'hora' => '15:15',
			'descripcion' => 'Debo ir a recoger a mi madre a la oficina'
		),
		array(
			'hora' => '22:00',
			'descripcion' => 'No quiero perderme el especial de televisión'
		)
	),
	'miercoles' => array(
		array(
			'hora' => '9:30',
			'descripcion' => 'He quedado con mi tutor'
		)
	),
	'jueves' => array(
		array(
			'hora' => '12:00',
			'descripcion' => 'Clase de inglés'
		)
	),
	'viernes' => array(
		array(
			'hora' => '10:45',
			'descripcion' => 'Cita con mi gestor en el banco'
		),
		array(
			'hora' => '13:00',
			'descripcion' => 'He quedado con mi hermano para ir a comer'
		),
		array(
			'hora' => '18:30',
			'descripcion' => 'Quedada para echar un partido de baloncesto'
		)
	),
	'sabado' => array(
		array(
			'hora' => '10:00',
			'descripcion' => 'Día de limpieza en casa'
		),
		array(
			'hora' => '16:00',
			'descripcion' => 'Tenemos reservado un escape room'
		)
	),
	'domingo' => array(
		array(
			'hora' => '14:00',
			'descripcion' => 'Comida familiar en casa de mis padres'
		)
	)
);

?>

Ahora sí tenemos nuestro array definido. Fijémonos, cada array interno dentro del array que representa un día, es un array sin índice definido (por tanto, tendrán índices numéricos) que contiene dos elementos, el primero con índice hora y el segundo con índice descripcion. Hemos definido, en cada día, una o más actividades que tienen una hora y una descripción.

Digamos que el primer array, $agenda_diaria representaría a nuestra semana. Los arrays dentro de este primer array representarían a los días. Y, dentro de los días, tenemos una o más actividades que son nuevos arrays con la hora y la descripción.

Puede que visto así la primera vez pueda ser algo abrumador, pero nada más lejos de la realidad. Entendiendo bien cuándo se está cerrando cada array, esta definición es bastante lógica. Aunque, normalmente, ésto no lo encontraremos en nuestros programas de esta forma, pues los datos serán obtenidos desde la base de datos. Pero ésa es otra historia.

Mostrando la hora de la primera actividad de cada día

Una vez definido nuestro array con todas las actividades que hayamos querido, vamos a hacer la primera consulta. Es sencilla, pues queremos obtener la hora de la primera actividad diaria, por ejemplo para saber a qué hora ponemos el despertador. Veamos el código que lo implementa:

// Consulta para mostrar la primera actividad de cada día
foreach($agenda_diaria as $dia => $actividades) {
	echo 'El ' . $dia . ' tengo la primera actividad a las ' . $actividades[0]['hora'] . '<br>';
}

?>

Como todavía no hemos visto cómo obtener el tamaño de un array y, además, necesitamos saber el día, utilizamos el bucle FOREACH. Con él, recorremos $agenda_diaria obteniendo, conforme vimos en el artículo correspondiente, y obtenemos así su índice, que guardamos en la variable $dia y las actividades de ese día, guardadas en la variable $actividades. El día será un string y las actividades serán otro array.

Por tanto, una vez tenemos el día y las actividades de cada día, mostraremos por pantalla ese mensaje. En dicho mensaje, imprimiremos la variable $dia, por lo que sabremos a qué día nos referimos. Y después imprimimos $actividades[0][‘hora’], es decir, en la variable actividades que contiene sólo las de un día concreto, accedemos a la actividad de índice 0 y al valor que tiene el índice ‘hora’ dentro de esa actividad. Como no hemos definido índices en las actividades, sabemos que la primera de ellas es la de índice 0 (también dijimos que todos los días tenían mínimo una actividad, si no fuera así, tendríamos que hacer una comprobación aquí). Una vez la tenemos, bastará con obtener el elemento que representa a la hora.

Mostrando la agenda de un día concreto

Este caso ya es más complejo porque necesita varias estructuras de control, pero una vez lo leamos veremos que es bastante lógico y no nos supondrá grandes esfuerzos. Hemos decidido que queremos consultar las actividades del viernes. Veamos el código:

// Consulta para mostrar la agenda del viernes
$dia_buscado = 'viernes';
foreach ($agenda_diaria as $dia => $actividades) {
	if ($dia_buscado === $dia) {
		foreach ($actividades as $actividad) {
			echo 'El ' . $dia_buscado . ' a las ' . $actividad['hora'] . ': ' . $actividad['descripcion'] . '<br>';
		}

		break;
	}
}

?>

En primer lugar, definimos el día que queremos buscar y lo guardamos en la variable $dia_buscado. Es muy importante que el texto sea exactamente igual al índice ‘viernes’ o no funcionará.

A continuación, hacemos el mismo FOREACH que en la consulta anterior, recorriendo todos los días y obteniendo el día y las actividades. Posteriormente comprobamos, gracias a un IF, si $dia_buscado es igual al día que estamos recorriendo y que está guardado en $dia.

El siguiente código sólo se ejecutará si la condición del IF es cierta, lo que significará que hemos encontrado el día buscado. Ahora tendremos que recorrer todas las actividades de ese día para mostrarlas, por lo que utilizamos un nuevo FOREACH y guardando cada actividad en la variable $actividad. Como veis, no hemos guardado el índice, pues además de que no vamos a utilizarlo, es numérico.

Finalmente, mostramos por pantalla cada una de las actividades. Para ello, y teniendo la variable $actividad cogiendo el valor de cada una de ellas sólo en el día especificado, mostramos $actividad[‘hora’] y también $actividad[‘descripcion’] en un mensaje para que quede más bonito.

Cuidado con el break

Una cosa más, el break. Si no lo hubiéramos puesto el programa hubiera funcionado correctamente. Sin embargo, hubiera seguido buscando hasta el domingo, pero nosotros ya sabemos que no era necesaria una vez encontramos el día. Por ello hemos puesto el break.

Pero hay que tener cuidado. Es un error sencillo el colocar el break dentro del segundo FOREACH. ¿Qué hubiera ocurrido? Piénsalo bien. Después de mostrar la primera actividad del día buscado, en este caso el viernes, hubiera ejecutado el break y no hubiera mostrado las demás actividades. Así pues, el break va después del segundo FOREACH y dentro del IF porque realmente queremos romper el primer FOREACH llegados a este punto y no antes, ni después.

Qué se mostraría por pantalla

Como curiosidad, os muestro lo que arrojaría este programa al completo por pantalla.

El lunes tengo la primera actividad a las 9:35
El martes tengo la primera actividad a las 10:00
El miercoles tengo la primera actividad a las 9:30
El jueves tengo la primera actividad a las 12:00
El viernes tengo la primera actividad a las 10:45
El sabado tengo la primera actividad a las 10:00
El domingo tengo la primera actividad a las 14:00
El viernes a las 10:45: Cita con mi gestor en el banco
El viernes a las 13:00: He quedado con mi hermano para ir a comer
El viernes a las 18:30: Quedada para echar un partido de baloncesto

Siguiente reto

Durante estas dos semanas, para ahora practicar con las funciones, hemos estado definiendo las funciones y viendo su uso en PHP. Además, hemos repasado muchas de las funciones más utilizadas que ya están definidas. Ya estamos listos para empezar a practicar con las funciones y añadir así nuevas formas de programar.

A practicar 1.0.5

Gracias a la estructura creada para la agenda en el reto anterior, queremos ahora mejorarla para que sea más funcional. Queremos practicar con las funciones así que, para ello, definiremos las siguientes funciones:

insertar_actividad a la cual le pasaremos un día de la semana, una hora y una actividad y nos lo insertará en nuestro array $agenda_diaria ordenado por la hora.

eliminar_actividad a la cual le pasaremos un día de la semana y una hora y nos eliminará ese elemento del array.

modificar_actividad a la cual le pasaremos un día de la semana, una hora y un array con una nueva actividad que sustituya a la existente. Esta función debe utilizar, para realizar la modificación, las funciones eliminar_actividad e insertar_actividad.

consultar_dia que, dado un día de la semana, nos diga todas las actividades que hay en ese día.

eliminar_actividades_de_un_dia que, dado un día de la semana, elimine todas las actividades utilizando la función eliminar_actividad para realizarlo.

Definidas estas funciones, queremos añadir alguna parte de código donde se utilicen como ejemplo. Podemos utilizar los datos iniciales del ejemplo colocados en la primera parte de este artículo.

Nota: debido a que todavía no hemos visto cómo trabajar con fechas y horas y necesitamos aquí comparar horas, asumamos que todas las horas tienen el formato XX:XX. Es decir, las horas que salen en el ejemplo indicadas como 9:35, por ejemplo, ponedlas como 09:35. Utilicemos también horas desde la 00:00 hasta las 23:59.

Recordad que podéis testear el código en sitios como phptester y que podéis dejar vuestras dudas o resultados en los comentarios. Para ello, antes debéis registraros. ¡Empecemos a practicar con las funciones!

Deja un comentario