使用PHP对CSV文件进行排序并在HTML表格中显示

时间:2016-02-24 22:50:42

标签: php html csv html-table

我有一个CSV文件,其中包含(虚拟)数据:

Mike Judge, Office Space, Comedy
Larry Wachowski, Matrix Zero, Action
Sofia Coppola, Lost In Translation, Drama
Ron Howard, A Beautiful Mind, Drama
Joe Biden, Your Big Hat, Sports
Barack Obama, The Stubborn Goat, Drama
Steve Smith, 2 Beautiful Ants, Suspense
Jared Hess, Napoleon Dynamite, Comedy
Jack Daniels, Field of Dreams, Drama

我需要第1个字段按姓氏的字母顺序排序。这很有效。

然后我需要在HTML表格中显示数组,并且能够将列数设置为5。我需要每个单元格从CSV文件中保留一行,然后从左向右移动填充表格。 / p>

我尝试过的所有内容都让我几乎在那里,但桌子显示不正确 - 它在最后一个td中缺少td标签或没有 

enter image description here

任何帮助都将不胜感激。

这是我到目前为止所拥有的:

 $file = fopen("dummy-list.csv", "r") or die('cannot open file');

// sort
$surnames = array();
$rows = array();
//build array of surnames, and array of rows
while (false != ( $row = fgetcsv($file, 0, ',') )) {
    //extract surname from the first column
    //this should match the last word before the comma, if there is a comma
    preg_match('~([^\s]+)(?:,.*)?$~', $row[0], $m);
    $surnames[] = $m[1];
    $rows[] = $row;
}
//fclose($file);
//sort array of rows by surname using our array of surnames
array_multisort($surnames, $rows);
//print_r($rows);


// set # of table columns
$numCols = 4;
$i=0;


echo '<table border="1" align="center"><tr>' . "\n";
foreach( $rows as $rows2 )
{

if ($i % $numCols == 0 && $i != 0) 
    echo "</tr>\n<tr>"; // every time but the first

    echo '<td>';

    foreach( $rows2 as $key )
    {
            echo $key . '<br />';
        $i++;
    }
    echo "</td>\n";
}


while ($i++ % $numCols != 0) 
echo '<td>&nbsp;</td>' . "\n"; // fill in empty cells


// end table
echo '</tr></table>' . "\n\n\n";

3 个答案:

答案 0 :(得分:1)

您只需要略微修改逻辑。目前,您的脚本不会跟踪您的列,因此无法知道要填充的单元格数。

最大的逻辑问题是:

while ($i++ % $numCols != 0) 
echo '<td>&nbsp;</td>' . "\n"; // fill in empty cells

正在做的就是检查$ i是否可以设计列数。所以,在$ i到达3后,它就会停止。 (在这种情况下为4/3!= 0)

以下作品:

$file = fopen("dummy-list.csv", "r") or die('cannot open file');

// sort
$surnames = array();
$rows = array();
//build array of surnames, and array of rows
while (false != ( $row = fgetcsv($file, 0, ',') )) {
   //extract surname from the first column
   //this should match the last word before the comma, if there is a comma
   preg_match('~([^\s]+)(?:,.*)?$~', $row[0], $m);
   $surnames[] = $m[1];
   $rows[] = $row;
}
//fclose($file);
//sort array of rows by surname using our array of surnames
array_multisort($surnames, $rows);
//print_r($rows);


// set # of table columns
$numCols = 4;
$i=0;
$cellpos = 0; //count columns

echo '<table border="1" align="center"><tr>' . "\n";
//use the amount of rows as a divisor
for($c=0; $c<Count($rows); $c++ )
{

    if ($i % $numCols == 0 && $i != 0){
       echo "</tr>\n<tr>"; // every time but the first
       $cellpos=0;  //reset our column position
    }

    echo '<td>';
    //then, call each csv row explicitly
    foreach( $rows[$c] as $key )
    {
        echo $key . '<br />';
        $i++;
    }
    echo "</td>\n";
    $cellpos++;  //track our column position
}

while ($cellpos++ < $numCols)
echo '<td>&nbsp;</td>' . "\n"; // fill in empty cells


// end table
echo '</tr></table>' . "\n\n\n";

我添加了$ cellpos变量来计算每行中的td,作为填充。每次开始新行时都会重置它。如果您通过脚本跟踪该var,您将看到我的更改。

此外,如果您想对这些键执行更具体的操作,可以直接调用它们,而不是仅仅循环遍历行。只需更改<td>代码之间的代码即可。

echo '<td>';

//then, call each csv celldata explicitly

    echo '<a href="' . $rows[$c][0]. '"><img src="'. $rows[$c][1] . '" /><br />' .$rows[$c][2] . '</a>';
    $i++;

echo "</td>\n";

答案 1 :(得分:1)

保持代码:

改变这个:

while ($i++ % $numCols != 0) 
echo '<td>&nbsp;</td>' . "\n"; // fill in empty cells

对于它:

$mod = $numCols-count($rows)%$numCols;

for($i=0;($i < ($mod) && $mod != $numCols);$i++)
    echo '<td>&nbsp;</td>' . "\n";

解决你的问题!

答案 2 :(得分:0)

您可以使用MOD运算符检查您是否位于列的末尾,然后结束该行,然后开始一个新行:

$cols = 4;
$count = count($rows);

$table_html ="<tr>";
for($i=0; $i < $count; ++$i){
    $table_html.= '<td>' . implode("<br>", $rows[$i]) . '</td>';
    if($i != 0 && ($i % $cols == 0)){
        $table_html.="</tr>";
    }
}
$table_html.="</tr>";
echo $table_html;