Php noob。
我有这个文本文件(names.txt),用逗号分隔的名称和代码。看起来类似于:
John doe, 123456, 876543
Mary Ann, 456878
Ben Anderson, 987554, 097532, 873445
正如您所看到的,每个名称可以包含不同数量的代码,范围从1到10。 我想要做的是将此信息输出为表格
我试过了:
<table>
<?php
$file_handle = fopen("names.txt", "rb");
while (!feof($file_handle) ) {
$line_of_text = fgets($file_handle);
$parts = explode(',', $line_of_text);
echo "<tr>";
echo "<td><strong>" . $parts[0] ."</strong></td>";
echo "<td>" . $parts[1] . "</td>";
echo "<td>" . $parts[2] . "</td>";
echo "<td>" . $parts[3] . "</td>";
echo "<td>" . $parts[4] . "</td>";
echo "<td>" . $parts[5] . "</td>";
echo "<td>" . $parts[6] . "</td>";
echo "<td>" . $parts[7] . "</td>";
echo "<td>" . $parts[8] . "</td>";
echo "<td>" . $parts[9] . "</td>";
echo "<td>" . $parts[10] . "</td>";
echo "</tr>";
}
fclose($file_handle);
?>
</table>
这不起作用,因为有时$ parts []将为空,并且没有任何输出,我收到错误。未定义的偏移量。 我怎么去做这个,只有当它有一个值时“回显”$ parts []?
答案 0 :(得分:1)
您可以使用fgetcsv()
注意:CSV文件中的空行将作为包含单个空字段的数组返回,并且不会被视为错误。
<table>
<?php
$handle = fopen("test.csv", "r");
while (($parts = fgetcsv($handle, 1000, ",")) !== FALSE) {
echo "<tr>";
echo "<td><strong>" . $parts[0] ."</strong></td>";
echo "<td>" . $parts[1] . "</td>";
echo "<td>" . $parts[2] . "</td>";
echo "<td>" . $parts[3] . "</td>";
echo "<td>" . $parts[4] . "</td>";
echo "<td>" . $parts[5] . "</td>";
echo "<td>" . $parts[6] . "</td>";
echo "<td>" . $parts[7] . "</td>";
echo "<td>" . $parts[8] . "</td>";
echo "<td>" . $parts[9] . "</td>";
echo "<td>" . $parts[10] . "</td>";
echo "</tr>";
}
fclose($file_handle);
?>
</table>
答案 1 :(得分:0)
while (!feof($file_handle) )
{
$line_of_text = fgets($file_handle);
$parts = explode(',', $line_of_text);
// line not empty?
if (isset($parts[0]) && !empty($parts[0]))
{
// first line
echo '<td>' . $parts[0] . '</td>';
// other lines
for($i = 1; $i <= 10; $i++) {
// echo with check
echo '<td>' . (isset($parts[$i]) ? $parts[$i] : '') . '</td>';
}
}
}
答案 2 :(得分:0)
不是像你所知道的那样回应所有部分(10行),你可以用这样的东西代替它:
for($i = 1; $i <= 10; $i++) {
echo '<td>' . (!empty($parts[$i]) ? $parts[$i] : '') . '</td>';
}
它做什么:循环10次并始终回声。在它内部检查该迭代的$ parts []是否为空,如果不是回声。否则它就什么也没回事。
你仍然希望所有人都在那里,否则你的桌子会被破坏(对最终用户来说会很奇怪)。
答案 3 :(得分:0)
undefined offset
错误是E_NOTICE
,这意味着可以安全地忽略它。要防止通知出现,请使用:
error_reporting(E_ALL ^ E_NOTICE);
如果您不想这样做,可以通过几种方法解决问题。一个技巧是将explode
行更改为:
$parts = explode(",", $line_of_text.",,,,,,,,,,");
这样总会有至少10个部分。
答案 4 :(得分:0)
<table>
<?php
$file_handle = fopen("names.txt", "rb");
while (!feof($file_handle) ) {
$line_of_text = fgets($file_handle);
$parts = explode(',', $line_of_text);
echo "<tr>";
echo "<td><strong>" . $parts[0] ."</strong></td>";
for($i=1; $i<=10; $i++) {
echo "<td>" . $parts[$i] ? $parts[$i] : '' . "</td>";
}
echo "</tr>";
}
fclose($file_handle);
?>
</table>