سؤال

ولقد لبناء جدول HTML التي تظهر البيانات للمستخدمين مقابل الصفحات التي تمت زيارتها. يبدو klunky لاستخدامها في الحلقات و / أو foreach، ولكن لا أستطيع أن أفكر في أي شيء أفضل. أنا باستخدام PHP، ولكن أود أن نفترض أن هذه هي اللغة الملحد.

هل كانت مفيدة؟

المحلول

وتجنب التكرار وربما غير ممكن، إن لم يكن في التنفيذ، بعد ذلك سوف لا يزال يحدث على مستوى الجهاز.

ولكن، إذا كنت ترغب في محاولة البقاء "نقية" دون رمز سيئة، يمكنك على الأقل القيام به:

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

وعلى الأقل بهذه الطريقة قد يكون للصيانة بعض الشيء. ولم يكن لديك الكثير من القلق حول سلاسل كاملة.

ويمكنك أيضا أن subsitutue بعض من هذا الرمز مع

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

وأي حين يجري موجزة بدلا من ذلك، سوف ربما تحصل في قليلا من الماء الساخن في نهاية المطاف، وسوف تحتاج إلى إعادة ترميز. (وتنهار داخليا يدير حلقة، لذلك لها يخسر فيها).

إذا كنت لا تمانع في الرأس على المكالمات وظيفة إضافية (والحلقات يزال قيد التشغيل) وهذا يمكن أن يجعل لرمز أكثر إيجازا من دون الكثير من السلبيات:

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

ولكن حذار، أن يكون من الصعب قراءة، واستمررت على هذا المنوال في يوم من الأيام سوف تستيقظ مع ثغة.

نصائح أخرى

حسنا، إذا كان لديك عدة صفوف، مع بيانات منسقة على نحو مماثل في كل صف، لا أستطيع التفكير في وسيلة لإنشاء جدول يتجنب استخدام حلقة. هذا النوع من الشيء هو أساسا ما حلقات اخترعت ل.

إذا قدم لنا مزيد من التفاصيل حول الجدول الذي تريد بناء، وربما يمكننا صياغة طريقة أفضل.

إذا كنت لا تستخدم بعض نوع من حلقة ثم تحتاج إلى ترميز ثابت للعدد الصفوف والأعمدة في التعليمات البرمجية، والتي ربما تكون فكرة أسوأ بكثير

إذا البيانات في الجدول الديناميكي ثم لديك لاستخدام حلقة. حتى إذا كنت تحصل على المكون الذي يولد الجدول بالنسبة لك، داخليا فإنه سيتم استخدام حلقة.

وأنا أوصى هندى templating لمحرك PHP. هذا سوف يسمح لك لنقل الجدول الخاص بك (وحلقة المرتبطة بها، والتي أمر لا مفر منه) في قالب باستخدام بناء الجملة هندى، لذلك سوف تكون أكثر وضوحا وفصلها عن منطق عملك. هل سيكون قادرا على استبدال تقريبا كافة التعليمات البرمجية في المثال الخاص بك مع عدد قليل من علامات بسيطة في مقتطف HTML. تحقق من دورة مكثفة في صفحة هندى للحصول على مثال باستخدام الجدول.

وهذا يعتمد على تعريفك لل"أفضل". FOR الحلقات سوف قيام بهذه المهمة على ما يرام. أنا لست مبرمج PHP، ولكن في .NET، يمكنك استخدام مكرر، نوعا من القالب الذي يمكنك استخدامها لإعلان HTML الجدول. لديها نماذج للرأس وتذييل الصفحة ولكل عنصر. يمكنك ربط مصدر البيانات إلى مكرر، وسوف توليد HTML الجدول بالنسبة لك أكثر قليلا أنيق من استخدام FOR الحلقات. أتصور قد يكون هناك نوع من النموذجيه ما يعادلها في PHP.

في النهاية، على الرغم من يستخدم حتى مكرر نوعا من حلقة ...

وماذا كنت ترغب في تجنب التكرار؟ إذا كان لديك مجموعة من العناصر، وكنت ترغب في عرض كل بند، حلقات بالتأكيد على مجموعة هو الحل واضح؟

إذا كنت تحاول فصل نموذج من طريقة العرض، أو كتابة التعليمات البرمجية أكثر قابلية للقراءة، وحسن. ولكن الحلقات ليست سيئة بطبيعتها.

وعادة ما تستخدم الحلقات وimplode لهذا، في PHP. في اللغة، التي تدعم البرمجة الوظيفية وأود أن نفعل ذلك بطريقة مختلفة.

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top