Döngüler bir tablo oluşturmak için en iyi yolu var mı?

8 Cevap php

Ben ziyaret sayfalar karşı kullanıcıların verilerini gösteren bir HTML tablosu oluşturmak zorunda. Bu döngüler için ve / veya foreach kullanmak klunky gibi görünüyor, ama ben daha iyi bir şey düşünemiyorum. Ben PHP kullanarak yapıyorum ama bu dil agnostik olduğunu zannedebilir.

8 Cevap

Uygulanmasında, sonra yine makine düzeyinde olur değilse döngüler kaçınarak, büyük olasılıkla mümkün değildir.

Eğer kötü kodu olmadan "saf" kalmaya denemek istiyorsanız Ancak, en azından yapabilirsiniz:

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

En azından bu şekilde biraz sürdürülebilir olabilir. ve eksik dizeleri hakkında çok fazla endişe yok.

Ayrıca ile bu kod bazı subsitutue olabilir

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

Oldukça özlü olurken, muhtemelen sonunda sıcak su biraz sizi alacak ve recoding gerekir hangi. (Ve içten çökmek bir döngü çalışır, bu yüzden onun bir kaybet-kaybet).

Ekstra fonksiyon çağrıları (ve hala çalışıyor döngüler) ve üzerinde kafa sakıncası yoksa bu çok negatif olmadan daha kısa kod için yapabilir:

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

Ama dikkat okumak zor thats, ve bir gün kadar Eğer lisp ile uyanmak edeceğiz tutun.

Eğer benzer her satırda biçimlendirilmiş verilerin birden fazla satır varsa Eh, ben bir döngü kullanarak önler bir tablo oluşturmak için bir yol düşünemiyorum. Bu tip şeyler döngüler için icat edildi temelde ne olduğunu.

Bize inşa etmek istediğiniz masaya daha fazla ayrıntı verdi, belki biz daha iyi bir yöntem formüle edebilirsiniz.

Eğer döngü some tür kullanmak istemiyorsanız o zaman muhtemelen çok daha kötü bir fikirdir kod satır ve sütun sayısını, kodlamalısınız gerekir

Tablodaki veriler dinamik ise o zaman bir döngü kullanmak zorunda. Sizin için bir tablo oluşturur bir bileşen almak bile, içten bir döngü kullanır.

Ben çok PHP için Smarty çiftleşmiş motoru öneririz. Bu tabloyu taşımak için izin (ve kaçınılmaz ilişkili loop) Smarty sözdizimini kullanarak şablon içine, yani bu iş mantığı daha net ve daha ayrılmış olacak olacaktır. Bir HTML kod parçasında bir kaç basit etiketleri ile örneğin neredeyse tüm kodunu değiştirmek mümkün olacaktır. Bir tablo kullanarak bir örnek için Smarty sayfada kurs göz atın.

Yani "en iyi" tanımına bağlıdır. Döngüler sadece iyi iş yapacak İÇİN. Ben bir PHP programcısı değilim, ama. NET'te, sen Repeater, size tablo HTML bildirmek için kullanabileceğiniz şablon bir türlü kullanabilirsiniz. Bu üstbilgi, altbilgi ve her öğe için şablonlar vardır. Sen tekrarlayıcı bir veri kaynağına bağlamak, ve biraz daha zarif döngüler İÇİN kullanarak daha sizin için masa HTML üretecektir. PHP çiftleşmiş eşdeğer çeşit var olabileceğini hayal.

Sonunda, olsa bile Tekrarlayıcı döngü çeşit kullanır ...

Neden döngüleri önlemek istiyor musunuz? Öğelerin bir dizi var, ve kesinlikle bariz çözüm kümesi üzerinde bir döngü, her öğeyi görüntülemek istiyorsanız?

, Iyi, görünümden modeli ayırmak, ya da daha okunabilir kod yazmaya çalışıyorsanız ama döngüler doğal olarak kötü değildir.

Ben genellikle PHP, bunun için kullanmak döngüler ve implode. Işlevsel programlama dili, ben daha farklı yapardı.

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;
}