Pregunta

Tengo que crear una tabla HTML que muestre datos para usuarios versus páginas visitadas. Parece extraño usarlo para y / o bucles foreach, pero no se me ocurre nada mejor. Estoy usando PHP, pero supongo que esto es independiente del lenguaje.

¿Fue útil?

Solución

Evitar bucles probablemente no sea posible, si no está en implementación, aún sucederá a nivel de máquina.

Sin embargo, si quieres intentar mantenerte 'puro' sin código desagradable, al menos puedes hacer:

$tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>';
$rowformat   = '<tr>%s</tr>'; 
$cellformat  = '<td>%s</td>'; 

$hdata = '';
foreach( $data[0] as $cellname => $cellvalue )
{
   $hdata  .= sprintf( $cellformat, $cellname ); 
}
$hdata = sprintf( $rowformat, $hdata ); 
$rdata = "";
foreach( $data as $rownum => $rowvalue ) 
{ 
   $row = "";
   foreach( $rowvalue as $colname => $colvalue ) 
   {
       $row .= sprintf( $cellformat, $colvalue );  
   }
   $rdata .= sprintf($rowformat,$row); 
}
return sprintf( $tableformat, $hdata, $rdata ); 

Al menos de esa manera podría ser algo mantenible. y no te preocupes mucho por las cadenas incompletas.

También puede subsituar parte de ese código con

   $hdata = "<tr><td>" . implode( "</td><td>", array_keys( $data[0] )) . "</td></tr>";
   $rdata .= "<tr><td>" . implode( "</td><td>", $rowvalue ) . "</td></tr>"; 

Lo cual, aunque es bastante conciso, posiblemente lo meterá en un poco de agua caliente eventualmente y necesitará recodificación. (e implosionar internamente ejecuta un bucle, por lo que es perder-perder).

Si no le molesta la sobrecarga de llamadas de funciones adicionales (y aún ejecuta bucles), esto podría generar un código más conciso sin demasiados negativos:

 $tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>';
 $rowformat   = '<tr>%s</tr>'; 
 $cellformat  = '<td>%s</td>'; 

function tr( $cells )
{  
   $o = "";
   foreach( $cells as $i => $v )
   {  
      $o .= sprintf( $cellformat, $v ); 
   }
   return sprintf( $rowformat, $o );  
}


return sprintf( $tableformat, 
               tr( array_keys($data[0])), 
               implode("", array_map( 'tr', $data )) ); 

Pero cuidado, eso es difícil de leer, y si sigues así un día te despertarás con lisp.

Otros consejos

Bueno, si tiene varias filas, con datos con un formato similar en cada fila, no se me ocurre una forma de crear una tabla que evite el uso de un bucle. Ese tipo de cosas es básicamente para lo que se inventaron los bucles.

Si nos dio más detalles sobre la tabla que desea construir, tal vez podamos formular un método mejor.

Si no usa algún tipo de bucle, entonces necesita codificar el número de filas y columnas en su código, lo que probablemente sea una idea mucho peor

Si los datos de la tabla son dinámicos, debe usar un bucle. Incluso si obtiene un componente que genera la tabla por usted, internamente usará un bucle.

Recomiendo encarecidamente el Smarty motor de plantillas para PHP. Esto le permitirá mover su tabla (y el bucle asociado, que es inevitable) a la plantilla utilizando la sintaxis Smarty, por lo que será más clara y más separada de su lógica empresarial. Podría reemplazar casi todo el código en su ejemplo con algunas etiquetas simples en un fragmento de HTML. Consulte el curso intensivo en la página Smarty para ver un ejemplo del uso de una tabla.

Eso depende de su definición de "mejor". Los bucles FOR harán el trabajo bien. No soy un programador de PHP, pero en .NET, puedes usar Repeater, una especie de plantilla que puedes usar para declarar la tabla HTML. Tiene plantillas para el encabezado, el pie de página y cada elemento. Vincula una fuente de datos al repetidor, y generará la tabla HTML para usted de manera un poco más elegante que usando bucles FOR. Me imagino que podría haber algún tipo de plantilla equivalente en PHP.

Al final, sin embargo, incluso el Repetidor usa algún tipo de bucle ...

¿Por qué quieres evitar los bucles? Si tiene un conjunto de elementos y desea mostrar cada elemento, ¿seguramente la solución obvia es recorrer el conjunto?

Si está tratando de separar el modelo de la vista, o si escribe un código más legible, bien; pero los bucles no son inherentemente malos.

Normalmente uso bucles e implode para esto, en PHP. En un lenguaje que admita la programación funcional, lo haría de manera diferente.

function render_table($data) {
  $html = '<table>';
  $tr = array();
  foreach (array_keys($data[0]) as $key) {
    $tr[] = '<th>' . htmlspecialchars($key) . '</th>';
  }
  $html .= "\n" . '<thead>' . "\n" . '<tr>' . "\n" . implode("\n", $tr) . '</tr>' . '</thead>';
  $tbody = array();
  foreach ($data as $row) {
    $tr = array();
    foreach ($row as $value) {
      $tr[] = '<td>' . htmlspecialchars($value) . '</td>';
    }
    $tbody[] = '<tr>' . "\n" . implode("\n", $tr) . '</tr>';
  }
  $html .= "\n" . '<tbody>' . "\n" . implode("\n", $tbody) . '</tbody>';
  $html .= '</table>';
  return $html;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top