elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [EJEMPLO]Inversión de la lectura de las claves en un array bidimensional
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [EJEMPLO]Inversión de la lectura de las claves en un array bidimensional  (Leído 1,247 veces)
Saberuneko


Desconectado Desconectado

Mensajes: 2.182



Ver Perfil WWW
[EJEMPLO]Inversión de la lectura de las claves en un array bidimensional
« en: 29 Octubre 2013, 20:58 pm »

Inversión de la lectura de las claves en un array bidimensional

Suponiendo el siguiente ejercicio:

Mostrar un conjunto de datos de un array bidimensional en una tabla.

Para este ejercicio, vamos a realizar un "calendario" con los menús del día para una semana.
El array tendrá dos claves. La primera será el día de la semana, y la segunda el componente del menú.

Se debe mostrar en las dos colocaciones posibles:


Normal:



Invertida:



A continuación el código y su explicación por partes:

Código
  1. <table border = "1" bgcolor = "9999cc">
  2. <?php
  3. //Cargamos el array con los valores.
  4. $menu=array(
  5. 'Lunes'=>array(
  6. 'Primer Plato' => 'Lentejas',
  7. 'Segundo Plato' => 'Merluza',
  8. 'Postre' => 'Flan',
  9. 'Precio' => '2'),
  10. 'Martes'=>array(
  11. 'Primer Plato' => 'Fabada',
  12. 'Segundo Plato' => 'Atun',
  13. 'Postre' => 'Helado',
  14. 'Precio' => '3'),
  15. 'Miercoles'=>array(
  16. 'Primer Plato' => 'Pote',
  17. 'Segundo Plato' => 'Tocino',
  18. 'Postre' => 'Yogur',
  19. 'Precio' => '2'),
  20. 'Jueves'=>array(
  21. 'Primer Plato' => 'Sopa',
  22. 'Segundo Plato' => 'Empanada',
  23. 'Postre' => 'Natillas',
  24. 'Precio' => '5'),
  25. 'Viernes'=>array(
  26. 'Primer Plato' => 'Pasta',
  27. 'Segundo Plato' => 'Ensalada',
  28. 'Postre' => 'Frijuelos',
  29. 'Precio' => '3'));
  30.  
  31. //Visualizamos en orden. (Platos arriba, Dias al lado)
  32.  
  33. echo "<tr><td></td>";
  34.  
  35. foreach($menu['Lunes'] as $plato => $valor)
  36. {
  37. echo "<td>$plato</td>";
  38. }
  39.  
  40. echo "</tr>";
  41.  
  42. foreach($menu as $dia => $valor)
  43. {
  44. echo "<tr><td>$dia</td>";
  45. foreach($menu[$dia] as $valor)
  46. {
  47. echo "<td>$valor</td>";
  48. }
  49. echo "</tr>";
  50. }
  51.  
  52. echo "<tr><td></td></tr>";
  53.  
  54. //Visualizamos intercambiando. (Dias arriba, Platos al lado)
  55. //Para ello, necesitamos intercambiar los bucles de posición.
  56.  
  57. echo "<tr><td></td>";
  58. foreach($menu as $clave => $valor)
  59. {
  60. $semana[]=$clave;
  61. echo "<td>$clave</td>";
  62. }
  63. foreach($menu['Lunes'] as $clave => $valor)
  64. {
  65. $datos[]=$clave;
  66. }
  67.  
  68. echo "</tr>";
  69.  
  70. foreach($datos as $plato)
  71. {
  72. echo "<tr><td>$plato</td>";
  73. foreach($semana as $dia)
  74. {
  75. echo "<td>{$menu[$dia][$plato]}</td>";
  76. }
  77. echo "</tr>";
  78. }
  79.  
  80. ?>
  81. </table>
  82.  

Primer paso, almacenamiento de los datos en el array:

Código:
$menu[$dia][$plato]

Cargamos el array de la siguiente forma:

Código
  1. //Cargamos el array con los valores.
  2. $menu=array(
  3. 'Lunes'=>array(
  4. 'Primer Plato' => 'Lentejas',
  5. 'Segundo Plato' => 'Merluza',
  6. 'Postre' => 'Flan',
  7. 'Precio' => '2'),
  8. 'Martes'=>array(
  9. 'Primer Plato' => 'Fabada',
  10. 'Segundo Plato' => 'Atun',
  11. 'Postre' => 'Helado',
  12. 'Precio' => '3'),
  13. 'Miercoles'=>array(
  14. 'Primer Plato' => 'Pote',
  15. 'Segundo Plato' => 'Tocino',
  16. 'Postre' => 'Yogur',
  17. 'Precio' => '2'),
  18. 'Jueves'=>array(
  19. 'Primer Plato' => 'Sopa',
  20. 'Segundo Plato' => 'Empanada',
  21. 'Postre' => 'Natillas',
  22. 'Precio' => '5'),
  23. 'Viernes'=>array(
  24. 'Primer Plato' => 'Pasta',
  25. 'Segundo Plato' => 'Ensalada',
  26. 'Postre' => 'Frijuelos',
  27. 'Precio' => '3'));
  28.  

Ahora es cuando viene el momento de visualizar los datos en un orden simple, sin invertir los índices. Iré paso a paso.

Primero, abrimos la primera fila de la tabla, y con foreach mostramos los distintos tipos de plato del día, tras hacer esto, cerramos la fila:

Código
  1. echo "<tr><td></td>";
  2.  
  3. foreach($menu['Lunes'] as $plato => $valor)
  4. {
  5. echo "<td>$plato</td>";
  6. }
  7.  
  8. echo "</tr>";
  9.  

Para ello, estamos obteniendo los valores de las segundas claves del Lunes.
Donde:
$menu['Lunes'] es el elemento del que recogemos la información.
$plato será el nombre de nuestro plato (2ª clave)
$valor es una variable que recoge el nombre del plato para el Lunes. (No lo utilizaremos todavía).

Nuestra instrucción echo "<td>$plato</td>" pondrá el valor de cada clave en una columna, montando la cabecera de la tabla.

A continuación, rellenamos el resto de la tabla, sin olvidar las claves que serían los días de la semana, para ello utilizaremos dos bucles foreach anidados:

Código
  1. foreach($menu as $dia => $valor)
  2. {
  3. echo "<tr><td>$dia</td>";
  4. foreach($menu[$dia] as $valor)
  5. {
  6. echo "<td>$valor</td>";
  7. }
  8. echo "</tr>";
  9. }
  10.  

Nuestro primer foreach recorre el primer valor del array, que serían los días de la semana.
El segundo bucle, anidado dentro del primero, recorrerá cada plato.

Por lo tanto, el programa irá mostrando los platos para cada día en orden.

Con nuestra primera instrucción echo "<tr><td>$dia</td>"; estamos mostrando el valor de la segunda clave del array, que sería nuestro día de la semana.

La segunda instrucción echo "<td>$valor</td>"; nos muestra el dato dentro de la posición actual del array que estamos recorriendo.

Si ejecutamos nuestro código hasta este punto, obtendremos el siguiente resultado:



--

Bien, ahora es cuando viene la parte complicada. ¿Qué pasa si queremos intercambiar filas y columnas?

Tendríamos que invertir el orden de anidación de nuestros bucles foreach, cosa que no podemos hacer a piñón fijo. Por lo que necesitaremos de un pequeño truco para realizar este recorrido, que es almacenar los valores de nuestras claves en dos arrays:

Código
  1. foreach($menu as $clave => $valor)
  2. {
  3. $semana[]=$clave;
  4. echo "<td>$clave</td>";
  5. }
  6. foreach($menu['Lunes'] as $clave => $valor)
  7. {
  8. $datos[]=$clave;
  9. }
  10.  

Aquí podemos ver cómo se recogen los valores de las claves en los arrays $semana (que contendrá los días de la semana) y $datos (que contendrá los tipos de plato, primero, segundo, postre...).

También aprovechamos el bucle para rellenar la primera fila de nuestra tabla, con los días de la semana con una instrucción echo "<td>$clave</td>";

Y aquí es donde viene el truco:

Código
  1. foreach($datos as $plato)
  2. {
  3. echo "<tr><td>$plato</td>";
  4. foreach($semana as $dia)
  5. {
  6. echo "<td>{$menu[$dia][$plato]}</td>";
  7. }
  8. echo "</tr>";
  9. }
  10.  

Ya que los arrays que contienen una clave única son de una única dimensión, podremos reordenar nuestros bucles y así mostrar el elemendo deseado con la instrucción "echo"<td>{$menu[$dia][$plato]}</td">;

¿Cómo funciona esto?

Sencillo, en este caso ya tenemos las claves, por lo que simplemente podemos tomar los datos del array $menu indicando qué claves estamos leyendo en cada momento.

En nuestro caso, estaremos leyendo los distintos primeros platos de cada día, luego los segundos, más tarde los postres, y finalmente su precio. Permitiéndonos rellenar la tabla con la colocación cambiada, ya que nuestros bucles están anidados al revés que en el caso anterior, con la segunda clave manteniéndose fija mientras la primera va cambiando.

Que nos quedará de la siguiente forma:



« Última modificación: 29 Octubre 2013, 21:04 pm por Saberuneko » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Array bidimensional en pascal.
Ejercicios
sv51 4 14,091 Último mensaje 21 Junio 2008, 22:30 pm
por sv51
Inicializar array bidimensional con palabras
Programación C/C++
folostia 5 4,410 Último mensaje 21 Diciembre 2011, 16:21 pm
por folostia
Ordenar array bidimensional
Java
KaRaLLo 5 18,736 Último mensaje 1 Abril 2013, 02:36 am
por seraff
[c++][Ayuda] Constructor y destructor con array bidimensional.
Programación C/C++
anonimo12121 2 2,983 Último mensaje 28 Marzo 2012, 22:02 pm
por anonimo12121
Ayuda con Array bidimensional
Programación General
Javaniano 0 2,020 Último mensaje 8 Diciembre 2012, 13:38 pm
por Javaniano
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines