martes, 9 de septiembre de 2014

PHP (02) Cadenas y matrices (12) Recorriendo matrices bidimensionales

Recorrer un array bidimensional requiere un poco de esfuerzo extra, ya que mantiene algo más de complejidad, pero en realidad se trata tan solo de anidar dos bucles, tal y como veremos en los siguientes ejemplos.

En el primero vamos a utilizar un código extraido del libro de McGrawHill (PHP manual de referencia) en el cual veremos como se anidan los dos bucles for para recorrer un array bidimensional:
<html>
<head>
<title>
Recorrido por matrices multidimensionales
</title>
</head>
<body>
 <h1>Recorrido por matrices multidimensionales</h1>
<?php
 $calificaciones[0][] = 79;
 $calificaciones[0][] = 74;
 $calificaciones[1][] = 69;
 $calificaciones[1][] = 84;
 for ($exterior = 0; $exterior < count($calificaciones); $exterior++){
  for($interior = 0; $interior < count($calificaciones[$exterior]); $interior++){
   echo "\$calificaciones[$exterior][$interior] = ", $calificaciones[$exterior][$interior], "<br>";
  }
 }
?>
</body>
</html>

Analizando los dos bucles vemos como se anidan considerando que cada elemento del array exterior envuelve a un array interior que se cuenta en el segundo for, lo cual nos da como resultado:
$calificaciones[0][0] = 79
$calificaciones[0][1] = 74
$calificaciones[1][0] = 69
$calificaciones[1][1] = 84


Esto que puede resultar muy útil para algunos ejercicios en realidad es menos útil que si trabajamos con arrays asociativos, es decir, en este ejemplo no sabemos a quien se refieren las clasificaciones pero en el siguiente ejemplo vamos a ver como se introduce el array dentro de una tabla y como se presenta mucho mejor la información con un array asociativo.
<html>
<head>
</head>
<body>

<?php
 $notas ['Paco'] [0] = "5";
 $notas ['Paco'] [1] = "6.7";
 $notas ['Paco'] [2] = "3"; 
 $notas ['Paco'] [3] = "8";
 $notas ['María'] [0] = "3";
 $notas ['María'] [1] = "7";
 $notas ['María'] [2] = "6";
 $notas ['María'] [3] = "9";
 $notas ['Pepe'] [0] = "4";
 $notas ['Pepe'] [1] = "8";
 $notas ['Pepe'] [2] = "5"; 
 $notas ['Pepe'] [3] = "8";

 print_r($notas);

 echo '<p>Como se muestra con una tabla en un doble bucle foreach</p>';
 echo '<table style="padding: 15px; border:1px solid gray;">';
 echo '<tr><td>Nombre</td><td>Nota 1</td><td>Nota2</td><td>Nota3</td><td>Nota 4</td></tr>';

 foreach ($notas as $nombre => $valor) {
  echo '<tr style="padding: 15px; background-color: gray;">';
  echo '<td style="padding: 15px;">' . $nombre . '</td>';
  foreach ($valor as $key => $value) {
   echo '<td style="padding: 15px;"> ' . $value . '</td>';
  }
  echo '</tr>'; 
 }
 echo '</table>'; 
 
?>

</body>
</html>



Aquí vemos como se declara el array asociativo, como se declara una tabla con su cabecera, y finalmente introducimos los dos foreach anidados.
En el primer foreach se declara la fila y la primera columna de la misma añadiendo el nombre mientras que en el segundo se recorren las notas y se van añadiendo en las diferente columnas.
Finalmente antes de que termine el ciclo exterior se cierra la fila y se vuelve a empezar con el siguiente nombre... dando el siguiente resultado:

Como puedes observar el resultado final es mucho más legible y entendible que si solo usamos los bucles y sin que los arrays sean asociativos.

Esto que a la hora de verse por primera vez puede resultar un tanto complejo es en realidad muy sencillo y lo utilizaremos en muchas ocasiones, por lo que os animo a hacer vuestras propias practicas.

Nota: El estilo de la tabla debería de ir en un archivo externo CSS, pero para ilustrar el ejemplo y no complicar su comprensión introduciendo archivos separados he preferido dejarlo embebido dentro del código.

No hay comentarios:

Publicar un comentario