2016-08-30 4 views
0

私はCSVを開き、データをHTMLテーブルに出力するクールなスクリプトを作りました。 :-)PHPループを壊してHTMLを変更する

しかし、私はデータの最初の行(テーブルの見出し)をとり、これらをtheadthの要素に入れることができますか?

<?php 
    echo "<table class='table table-bordered'>\n\n"; 
    $f = fopen("users.csv", "r"); 
    while (($line = fgetcsv($f)) !== false) { 
     $row = "<tr>"; 
     $is_empty = false; 
     foreach ($line as $cell) { 
      if ($cell !== '') { 
       $row .= "<td>" . htmlspecialchars($cell) . "</td>"; 
      } else { 
       $is_empty = true; 
      } 
     } 
     $row .= "</tr>\n"; 
     if ($is_empty) { 
      continue; 
     } else { 
      echo $row; 
     } 
    } 
    fclose($f); 
    echo "\n</table>"; 
?> 

は今、私のHTMLは次のとおりです。

<table class='table table-bordered'> 
<tr><td>Forename</td><td>Surname</td><td>Extension</td></tr> 
<tr><td>Jim</td><td>Carey</td><td>9843</td></tr> 
</table> 

私はこれを変更することができます。

<table class='table table-bordered'> 
<thead><tr><th>Forename</th><th>Surname</th><th>Extension</th></tr></thead> 
<tr><td>Jim</td><td>Carey</td><td>9843</td></tr> 
</table> 

どんな指導をいただき、ありがとうございます。

答えて

1

あなたのコード

<?php 
    echo "<table class='table table-bordered'>\n\n"; 
    $f = fopen("users.csv", "r"); 

    $first_line=false; 

    while (($line = fgetcsv($f)) !== false) { 
     $row =""; 

     if($first_line == false) { 
      $row = "<thead><tr>"; 
      $col= "th"; 
     } 
     else { 
      $row = "<tr>"; 
      $col= "td"; 
     } 


     $is_empty = false; 

     foreach ($line as $cell) { 
      if ($cell !== '') { 
       $row .= "<".$col.">" . htmlspecialchars($cell) . "</".$col.">"; 
      } else { 
       $is_empty = true; 
      } 
     } 


     if($first_line == false) $row .= "</tr></thead>"; 
     else $row .= "</tr>"; 

     $first_line=true; 

     if ($is_empty) { 
      continue; 
     } else { 
      echo $row; 
     } 
    } 
    fclose($f); 
    echo "\n</table>"; 
?> 
+0

優秀! :-)「​​」を ''に置き換えることは 'thead'の中にあるとき可能ですか? – michaelmcgurk

+1

変更済み...ありがとうございます!!! –

+1

再度修正しました... –

0

は、あなたが最初の行を表示していることを検出するためのカウンタを使用することができます。

echo "<table class='table table-bordered'>\n\n"; 
$f = fopen("users.csv", "r"); 
$counter = 0; 
while (($line = fgetcsv($f)) !== false) { 
    if ($counter == 0) { 
     $row .= "<thead><tr>"; 
     $is_empty = false; 
     foreach ($line as $cell) { 
      if ($cell !== '') { 
       $row .= "<th>" . htmlspecialchars($cell) . "</th>"; 
      } else { 
       $is_empty = true; 
      } 
     } 
     $row .= "</tr></thead>\n"; 
    } else { 
     $row .= "<tr>"; 
     $is_empty = false; 
     foreach ($line as $cell) { 
      if ($cell !== '') { 
       $row .= "<td>" . htmlspecialchars($cell) . "</td>"; 
      } else { 
       $is_empty = true; 
      } 
     } 
     $row .= "</tr>\n"; 
    } 

    $counter++; 
    if ($is_empty) { 
     continue; 
    } else { 
     echo $row; 
    } 
} 
fclose($f); 
echo "\n</table>"; 
0

はいで最初の行識別子を追加する必要があります。最初の行が常にヘッダーの場合、行にカウンタを使用できます。

$rowCounter = 0; 
while (($line = fgetcsv($f)) !== false) { 
    $tr = '<tr>'; 
    $td = '<td>'; 
    $tr_end = '</tr>'; 
    $td_end = '</td>'; 
    if (++$rowCounter == 1){ 
     $tr = '<thead><tr>'; 
     $td = '<th>'; 
     $tr_end = '</tr></thead>'; 
     $td_end = '</th>'; 
    } 
... your code ... 
} 

ここでは、これらの変数をコード内で使用できます。他にもいくつか解決策があります。

希望すると便利です。

0

マークアップテキストを関数を使用して別々に生成すると、より細かくなります。

function tr($data, $head = false, $xssProtect = true){ 
    // Formatting 
    $cellFmt = $head? "<th>%s</th>": "<td>%s</td>"; 
    $rowFmt = $head? "<thead><tr>%s</tr></thead>": "<tr>%s</tr>"; 
    $returnFmt = sprintf($rowFmt, str_repeat($cellFmt, count($data))); 

    // XSS 
    if ($xssProtect) $data = array_map('htmlspecialchars', $data); 

    // Format and return output 
    return vsprintf($returnFmt, $data); 
} 


echo "<table class='table table-bordered'>\n\n"; 
$f = fopen("users.csv", "r"); 
$line_no = 0; 
while (($line = fgetcsv($f)) !== false) { 
    echo tr($line, !$line_no); 
    $line_no++; 
} 
fclose($f); 
echo "\n</table>"; 
関連する問題