PHP:分解文件并仅输出具有值的部分

时间:2011-12-14 08:38:50

标签: php explode

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 []?

5 个答案:

答案 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>