Página 1 de 1

Crear tabla html desde una referencia

NotaPublicado: 2017-10-11 21:33 @939
por Superdri
Hola.

Tengo una referencia con los siguientes datos y me gustaría pasarlos a una tabla HTML pero no le encuentro la lógica para hacerlo :cry:
$players = {
'rbg' => [
{ 'name' => 'Sofisen', 'realm_name' => 'Ravencrest', 'ranking' => '1', 'rating' => '2742' },
{ 'realm_name' => 'Tarren Mill', 'ranking' => '2', 'rating' => '2737', 'name' => 'Sångsvan' },
{ 'name' => 'Wâllirikz', 'ranking' => '3', 'rating' => '2736', 'realm_name' => 'Ravencrest' },
{ 'rating' => '2733', 'ranking' => '4', 'realm_name' => 'Sylvanas', 'name' => 'Lurtex' },
{ 'name' => 'Precezeswusu', 'ranking' => '5', 'rating' => '2727', 'realm_name' => 'Lightbringer' },
],
'2v2' => [
{ 'realm_name' => 'Tirion', 'rating' => '2859', 'ranking' => '1', 'name' => 'Ilovelucy' },
{ 'name' => 'Boruggjr', 'realm_name' => 'Aegwynn', 'ranking' => '2', 'rating' => '2851' },
{ 'realm_name' => 'Stormscale', 'ranking' => '3', 'rating' => '2766', 'name' => 'Flåppers' },
{ 'name' => 'Takès', 'realm_name' => 'Outland', 'rating' => '2765', 'ranking' => '4' },
{ 'name' => 'Trenclentest', 'ranking' => '5', 'rating' => '2748', 'realm_name' => 'Outland' },
],
'3v3' => [
{ 'ranking' => '1', 'rating' => '2908', 'realm_name' => 'Alleria', 'name' => 'Chasx' },
{ 'realm_name' => 'Ravencrest', 'rating' => '2908', 'ranking' => '1', 'name' => 'Béstworld' },
{ 'ranking' => '1', 'rating' => '2908', 'realm_name' => 'Ravencrest', 'name' => 'Raíku' },
{ 'name' => 'Pïkachu', 'ranking' => '4', 'rating' => '2800', 'realm_name' => 'Der Mithrilorden' },
{ 'name' => 'Aviwings', 'rating' => '2800', 'ranking' => '4', 'realm_name' => 'Wrathbringer' },
]
};

Me gustaría sacar una tabla HTML con el top5 de cada rama(rbg, 2v2, 3v3) estilo
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
TopRBG           Top2v2           Top3v3
Jugadortop1derbg Jugadortop1de2v2 Jugadortop1de3v3
Jugadortop2derbg Jugadortop2de2v2 Jugadortop2de3v3
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Es la primera vez que intento hacer algo parecido y no encuentro la lógica para hacerlo, si alguien sabe más o menos cómo hacerlo estaría genial :)

Lo único que se me ha ocurrido de momento es lo siguiente aunque no van por aquí los tiros:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. <table class="table">
  2.   <thead>
  3.     <tr>
  4.      <th>Top 10 2v2</th>
  5.          <th>Top 10 3v3</th>
  6.          <th>Top 10 RBG</th>
  7.     </tr>
  8.    </thead>
  9.    <tbody>
  10.      <tr>
  11. EOT
  12.         my ($fila, $columna);
  13.        
  14.         my @players2v2 = @{$players->{'2v2'}};
  15.         foreach my $data (@players2v2) {
  16.                 $return .= <<EOT;
  17.           <td>$data->{name}</td>
  18. EOT
  19.         }
  20.         $return .= <<EOT;
  21.      </tr>
  22.      <tr>
  23. EOT
  24.         my @players3v3 = @{$players->{'3v3'}};
  25.         foreach my $data (@players3v3) {
  26.                 $return .= <<EOT;
  27.           <td>$data->{name}</td>
  28. EOT
  29.         }
  30.         $return .= <<EOT;
  31.      </tr>
  32.      <tr>
  33. EOT
  34.         my @playersrbg = @{$players->{'rbg'}};
  35.         foreach my $data (@playersrbg) {
  36.                 $return .= <<EOT;
  37.           <td>$data->{name}</td>
  38. EOT
  39.         }
  40.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Saludos.

Re: Crear tabla html desde una referencia

NotaPublicado: 2017-10-11 22:11 @966
por explorer
Se trata de una estructura sencilla... bueno, algo compleja :)

$players es una referencia a un hash.

En ese hash, los valores apuntados por las claves son referencias a arrays, cuyos elementos son referencias a hash, que almacenan la información final.

Así, para acceder a un dato cualquiera, podríamos escribir algo así:

say $players->{'3v3'}[1]{'realm_name'}; # 'Ravencrest'

O realizar una serie de bucles que recorran los índices de los hash y arrays, e ir pintando los valores en su posición adecuada dentro de la tabla.

En el documento perldoc perllol (en tu ordenador, o traducido aquí) encontrarás una sección para pintar una estructura de arrays de arrays, que se parece mucho a lo que tienes aquí.

Inténtalo. Si te atascas, vuelve por aquí, y te damos más pistas.

Re: Crear tabla html desde una referencia

NotaPublicado: 2017-10-12 00:24 @058
por Superdri
Hola, gracias por la ayuda :)

He conseguido hacer un bucle que recorre los valores, pero lo de pintar los valores en cada posición no lo pillo :<

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Data::Dumper;
  2. use utf8;
  3.  
  4. $players = {
  5. 'rbg' => [
  6. { 'name' => 'Sofisen', 'realm_name' => 'Ravencrest', 'ranking' => '1', 'rating' => '2742' },
  7. { 'realm_name' => 'Tarren Mill', 'ranking' => '2', 'rating' => '2737', 'name' => 'Sångsvan' },
  8. { 'name' => 'Wâllirikz', 'ranking' => '3', 'rating' => '2736', 'realm_name' => 'Ravencrest' },
  9. { 'rating' => '2733', 'ranking' => '4', 'realm_name' => 'Sylvanas', 'name' => 'Lurtex' },
  10. { 'name' => 'Precezeswusu', 'ranking' => '5', 'rating' => '2727', 'realm_name' => 'Lightbringer' },
  11. ],
  12. '2v2' => [
  13. { 'realm_name' => 'Tirion', 'rating' => '2859', 'ranking' => '1', 'name' => 'Ilovelucy' },
  14. { 'name' => 'Boruggjr', 'realm_name' => 'Aegwynn', 'ranking' => '2', 'rating' => '2851' },
  15. { 'realm_name' => 'Stormscale', 'ranking' => '3', 'rating' => '2766', 'name' => 'Flåppers' },
  16. { 'name' => 'Takès', 'realm_name' => 'Outland', 'rating' => '2765', 'ranking' => '4' },
  17. { 'name' => 'Trenclentest', 'ranking' => '5', 'rating' => '2748', 'realm_name' => 'Outland' },
  18. ],
  19. '3v3' => [
  20. { 'ranking' => '1', 'rating' => '2908', 'realm_name' => 'Alleria', 'name' => 'Chasx' },
  21. { 'realm_name' => 'Ravencrest', 'rating' => '2908', 'ranking' => '1', 'name' => 'Béstworld' },
  22. { 'ranking' => '1', 'rating' => '2908', 'realm_name' => 'Ravencrest', 'name' => 'Raíku' },
  23. { 'name' => 'Pïkachu', 'ranking' => '4', 'rating' => '2800', 'realm_name' => 'Der Mithrilorden' },
  24. { 'name' => 'Aviwings', 'rating' => '2800', 'ranking' => '4', 'realm_name' => 'Wrathbringer' },
  25. ]
  26. };
  27.  
  28. print <<EOT;
  29. <table class="table">
  30.  <thead>
  31.   <tr>
  32.    <th>Top 2v2</th>
  33.    <th>Top 3v3</th>
  34.    <th>Top RBG</th>
  35.   </tr>
  36.  </thead>
  37.  <tbody>
  38. EOT
  39.  
  40. %players = %{$players};
  41. for $href ( %players ) {
  42.         @entradas = @{$href};
  43.         for $entrada (@entradas) {
  44.                 print "$entrada->{ranking} $entrada->{name}\n";
  45.         }
  46. }
  47.  
  48. print <<EOT;
  49.  </tbody>
  50. </table>
  51. EOT
  52.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Crear tabla html desde una referencia

NotaPublicado: 2017-10-12 07:03 @336
por explorer
Según el primer mensaje de este hilo, debes recorrer las filas por orden de jugador, y en cada jugador, poner en cada columna por categoría.

Entonces debes recorrer la tabla para que cada fila (<tr>) sea el jugador i-ésimo de cada categoría. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Por cada jugador i-ésimo
        Pinto <tr>
        Para cada categoría
                Pintar jugador i-ésimo de esa categoría, dentro de un <td>
        Pinto </tr>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Inténtalo. Si lo ves complicado, aquí tienes una solución.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use utf8;
  3. use open qw(:std :utf8);
  4.  
  5. $players = {
  6.     'rbg' => [
  7.         { 'name' => 'Sofisen', 'realm_name' => 'Ravencrest', 'ranking' => '1', 'rating' => '2742' },
  8.         { 'realm_name' => 'Tarren Mill', 'ranking' => '2', 'rating' => '2737', 'name' => 'Sångsvan' },
  9.         { 'name' => 'Wâllirikz', 'ranking' => '3', 'rating' => '2736', 'realm_name' => 'Ravencrest' },
  10.         { 'rating' => '2733', 'ranking' => '4', 'realm_name' => 'Sylvanas', 'name' => 'Lurtex' },
  11.         { 'name' => 'Precezeswusu', 'ranking' => '5', 'rating' => '2727', 'realm_name' => 'Lightbringer' },
  12.     ],
  13.     '2v2' => [
  14.         { 'realm_name' => 'Tirion', 'rating' => '2859', 'ranking' => '1', 'name' => 'Ilovelucy' },
  15.         { 'name' => 'Boruggjr', 'realm_name' => 'Aegwynn', 'ranking' => '2', 'rating' => '2851' },
  16.         { 'realm_name' => 'Stormscale', 'ranking' => '3', 'rating' => '2766', 'name' => 'Flåppers' },
  17.         { 'name' => 'Takès', 'realm_name' => 'Outland', 'rating' => '2765', 'ranking' => '4' },
  18.         { 'name' => 'Trenclentest', 'ranking' => '5', 'rating' => '2748', 'realm_name' => 'Outland' },
  19.     ],
  20.     '3v3' => [
  21.         { 'ranking' => '1', 'rating' => '2908', 'realm_name' => 'Alleria', 'name' => 'Chasx' },
  22.         { 'realm_name' => 'Ravencrest', 'rating' => '2908', 'ranking' => '1', 'name' => 'Béstworld' },
  23.         { 'ranking' => '1', 'rating' => '2908', 'realm_name' => 'Ravencrest', 'name' => 'Raíku' },
  24.         { 'name' => 'Pïkachu', 'ranking' => '4', 'rating' => '2800', 'realm_name' => 'Der Mithrilorden' },
  25.         { 'name' => 'Aviwings', 'rating' => '2800', 'ranking' => '4', 'realm_name' => 'Wrathbringer' },
  26.     ]
  27. };
  28.  
  29. print <<EOT;
  30. <table class="table">
  31.  <thead>
  32.   <tr>
  33.    <th>Top RBG</th>
  34.    <th>Top 2v2</th>
  35.    <th>Top 3v3</th>
  36.   </tr>
  37.  </thead>
  38.  <tbody>
  39. EOT
  40.  
  41. # La tabla que hay que sacar es:
  42. # Cada fila debe ser la de cada jugador en cada categoría:
  43. # TopRBG           Top2v2           Top3v3
  44. # Jugadortop1derbg Jugadortop1de2v2 Jugadortop1de3v3
  45. # Jugadortop2derbg Jugadortop2de2v2 Jugadortop2de3v3
  46. # ...
  47. my @categorias = qw( rbg 2v2 3v3 );
  48.  
  49. # Averiguar el número de jugadores
  50. my $num_players = @{ $players->{'rbg'} };
  51.  
  52. # Recorrer la tabla por filas de jugadores, en estas categorías:
  53. for (my $i = 0; $i < $num_players; $i++) {
  54.  
  55.     print "  <tr>\n";
  56.  
  57.     for my $categoria (@categorias) {
  58.  
  59.         print "   <td>$players->{$categoria}[$i]{'ranking'} $players->{$categoria}[$i]{'name'}</td>\n";
  60.     }
  61.  
  62.     print "  </tr>\n";
  63. }
  64.  
  65. # fin de tabla
  66. print <<EOT;
  67.  </tbody>
  68. </table>
  69. EOT
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<table class="table">
 <thead>
  <tr>
   <th>Top RBG</th>
   <th>Top 2v2</th>
   <th>Top 3v3</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>1 Sofisen</td>
   <td>1 Ilovelucy</td>
   <td>1 Chasx</td>
  </tr>
  <tr>
   <td>2 Sångsvan</td>
   <td>2 Boruggjr</td>
   <td>1 Béstworld</td>
  </tr>
  <tr>
   <td>3 Wâllirikz</td>
   <td>3 Flåppers</td>
   <td>1 Raíku</td>
  </tr>
  <tr>
   <td>4 Lurtex</td>
   <td>4 Takès</td>
   <td>4 Pïkachu</td>
  </tr>
  <tr>
   <td>5 Precezeswusu</td>
   <td>5 Trenclentest</td>
   <td>4 Aviwings</td>
  </tr>
 </tbody>
</table>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Re: Crear tabla html desde una referencia

NotaPublicado: 2017-10-12 18:47 @824
por Superdri
Hola, muchas gracias por la solución.

Ya veo que el truco estaba en contar el número de jugadores primero para luego hacer el bucle principal en torno a eso. Muy buena solución :)

Yo, al final como no me salía decidí solucionarlo de otro modo más fácil, utilizando 3 contenedores HTML para hacer 3 columnas y en cada una meter una tabla con los datos de la categorías 'rbg', '2v2' o '3v3'.

¡Saludos y hasta otra!