Domanda

Devo costruire una tabella HTML che mostri i dati per gli utenti rispetto alle pagine visitate. Sembra klunky da usare per e / o foreach loop, ma non riesco a pensare a niente di meglio. Sto usando PHP, ma presumo che si tratti di linguaggio agnostico.

È stato utile?

Soluzione

Probabilmente evitare i loop non è possibile, se non in fase di implementazione, quindi continuerà a verificarsi a livello di macchina.

Tuttavia, se vuoi provare a rimanere 'puro' senza codice cattivo, puoi almeno farlo:

$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 ); 

Almeno in questo modo potrebbe essere in qualche modo mantenibile. e non ti preoccupi molto delle stringhe incomplete.

Puoi anche abbonare parte di quel codice con

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

Che, pur essendo piuttosto conciso, alla fine ti porterà un po 'di acqua calda e dovrà essere ricodificato. (e implodere internamente esegue un ciclo, quindi è un perdente).

Se non ti dispiace il sovraccarico di chiamate extra di funzione (e ancora in esecuzione di cicli) questo potrebbe rendere il codice più conciso senza troppi aspetti negativi:

 $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 )) ); 

Ma attenzione, è difficile da leggere, e continuerai a svegliarti un giorno ti sveglierai con un pò di leggerezza.

Altri suggerimenti

Bene, se hai più righe, con dati formattati in modo simile in ogni riga, non riesco a pensare a un modo per creare una tabella che eviti di usare un ciclo. Questo tipo di cose è sostanzialmente ciò per cui sono stati inventati i loop.

Se ci hai fornito maggiori dettagli sulla tabella che desideri compilare, forse possiamo formulare un metodo migliore.

Se non usi alcuni tipi di loop, devi codificare il numero di righe e colonne nel tuo codice, il che è probabilmente un'idea molto peggiore

Se i dati nella tabella sono dinamici, è necessario utilizzare un ciclo. Anche se ottieni un componente che genera la tabella per te, internamente utilizzerà un ciclo.

Consiglio vivamente il Smarty motore di template per PHP. Ciò ti consentirà di spostare la tabella (e il ciclo associato, che è inevitabile) nel modello utilizzando la sintassi Smarty, in modo che sia più chiara e più separata dalla tua logica aziendale. Saresti in grado di sostituire quasi tutto il codice nel tuo esempio con alcuni semplici tag in uno snippet HTML. Dai un'occhiata al corso intensivo nella pagina Smarty per un esempio di utilizzo di una tabella.

Dipende dalla tua definizione di "migliore". I loop FOR faranno il lavoro bene. Non sono un programmatore PHP, ma in .NET è possibile utilizzare Repeater, una sorta di modello che è possibile utilizzare per dichiarare la tabella HTML. Ha modelli per l'intestazione, il piè di pagina e ogni elemento. Associ un'origine dati al ripetitore e genererai la tabella HTML per te in modo un po 'più elegante rispetto all'utilizzo dei loop FOR. Immagino che potrebbe esserci una sorta di equivalente modello nel PHP.

Alla fine, però, anche il ripetitore usa una sorta di loop ...

Perché vuoi evitare i loop? Se hai un set di elementi e vuoi visualizzare ogni articolo, sicuramente passare in rassegna il set è la soluzione ovvia?

Se stai provando a separare il modello dalla vista, o scrivi più codice leggibile, bene; ma i loop non sono intrinsecamente cattivi.

Di solito uso i loop e implode per questo, in PHP. In un linguaggio che supporta la programmazione funzionale, lo farei diversamente.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top