Frage

Ich habe eine HTML-Tabelle erstellen, die Daten zeigt, für die Nutzer im Vergleich zu besuchten Seiten. Es scheint klunky für und / oder foreach-Schleifen zu verwenden, aber ich kann nicht glauben, besser nichts. Ich bin mit PHP, aber ich würde davon ausgehen, dass diese Sprache Agnostiker ist.

War es hilfreich?

Lösung

Schleifen zu vermeiden, ist wahrscheinlich nicht möglich, wenn nicht bei der Umsetzung, dann wird es noch auf Maschinenebene passieren.

Wenn Sie jedoch versuchen wollen bleiben ‚reine‘ ohne bösen Code, können Sie zumindest tun:

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

Wenigstens auf diese Weise könnte es etwas wartbar sein. und Sie haben nicht viele Sorgen über unvollständige Strings.

Sie können auch einen Teil dieser Code mit

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

Welche während eher prägnant zu sein, werden Sie möglicherweise schließlich in ein wenig heißes Wasser und es wird Umkodierung benötigen. (Und implodieren intern läuft eine Schleife, so dass ihr eine lose-lose).

Wenn Sie nicht den Kopf über zusätzliche Funktionsaufrufe dagegen (und noch laufende Loops) dies ohne zu viele Negativ für prägnanten Code machen könnte:

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

Aber Vorsicht, das ist schwer zu lesen, und Sie halten, dass ein Tag bis Sie mit Lisp aufwachen werden.

Andere Tipps

Nun, wenn Sie mehrere Zeilen mit Daten in ähnlicher Weise in jeder Zeile formatiert ist, kann ich mich nicht von einem Weg, um eine Tabelle zu erstellen, die eine Schleife vermeidet verwenden. Diese Art der Sache ist im Grunde, was für Schleifen erfunden wurde.

Wenn Sie uns weitere Details auf dem Tisch geben Sie bauen wollen, können wir vielleicht eine bessere Methode formulieren.

Wenn Sie nicht verwenden einig Art von Schleife, dann müssen Sie die Anzahl der Zeilen und Spalten in Ihrem Code codieren, das ist wahrscheinlich eine viel schlechtere Idee

Wenn die Daten in der Tabelle dynamisch sind, dann müssen Sie eine Schleife verwenden. Selbst wenn Sie eine Komponente erhalten, die für Sie die Tabelle erzeugt, intern wird es eine Schleife verwenden.

Sie sollten unbedingt die Smarty Template-Engine für PHP. Dies ermöglicht es ihnen, den Tisch zu bewegen (und die damit verbundene Schleife, die unvermeidbar ist) in die Vorlage mit Smarty-Syntax, so wird es von Ihrem Business-Logik klarer und getrennt werden. Sie wäre in der Lage, fast alle den Code in Ihrem Beispiel mit einem paar einfachen Tags in einem HTML-Schnipsel zu ersetzen. Schauen Sie sich den Crash-Kurs auf der Smarty Seite für ein Beispiel unter Verwendung einer Tabelle.

Das hängt von Ihrer Definition von "best". FOR-Schleifen wird die Arbeit machen einfach gut. Ich bin kein PHP-Programmierer, aber in .NET, können Sie den Repeater, eine Art Vorlage verwenden, die Sie in der Tabelle HTML zu erklären, verwenden können. Es verfügt über Vorlagen für den Header, Footer und jedes Element. Sie binden eine Datenquelle mit dem Repeater, und es wird die Tabelle HTML für Sie ein bisschen mehr elegant als die Verwendung von FOR-Schleifen generieren. Ich stelle mir vor es könnte eine Art sein Äquivalent Templating in PHP.

Am Ende aber auch der Repeater verwendet eine Art Schleife ...

Warum wollen Sie Schleifen vermeiden? Wenn Sie eine Reihe von Elementen, und Sie wollen jedes Element angezeigt werden, sicher über die eingestellten Looping ist die offensichtliche Lösung?

Wenn Sie versuchen, das Modell aus der Sicht zu trennen, oder besser lesbaren Code schreiben, gut; aber Schleifen sind nicht von Natur aus schlecht.

Normalerweise verwende ich Loops und implode dafür, in PHP. In einer Sprache, die es funktionale Programmierung unterstützt würde ich anders machen.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top