我有一个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标签或没有
。
任何帮助都将不胜感激。
这是我到目前为止所拥有的:
$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> </td>' . "\n"; // fill in empty cells
// end table
echo '</tr></table>' . "\n\n\n";
答案 0 :(得分:1)
您只需要略微修改逻辑。目前,您的脚本不会跟踪您的列,因此无法知道要填充的单元格数。
最大的逻辑问题是:
while ($i++ % $numCols != 0)
echo '<td> </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> </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> </td>' . "\n"; // fill in empty cells
对于它:
$mod = $numCols-count($rows)%$numCols;
for($i=0;($i < ($mod) && $mod != $numCols);$i++)
echo '<td> </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;