2016-08-30 5 views
0

Я построил классный скрипт, который открывает CSV и выводит данные в таблицу HTML - аккуратно! :-)Перерыв PHP цикл и изменение HTML

Однако, мне было интересно, можно ли взять первую строку данных (заголовки таблиц) и поместить их внутри элементов thead и th?

<?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>"; 
Смежные вопросы