2011-12-14 27 views
0

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

我有这个文本文件(names.txt)用逗号分隔的名称和代码。类似于此:

John doe, 123456, 876543 
Mary Ann, 456878 
Ben Anderson, 987554, 097532, 873445 

正如你可以看到每个名字都可以有不同的代码量,从一个长达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 []?

回答

0

相反echo'ing就像你所知道的(10行)的所有部件,你可以通过这样的替换:

for($i = 1; $i <= 10; $i++) { 
    echo '<td>' . (!empty($parts[$i]) ? $parts[$i] : '') . '</td>'; 
} 

它能做什么:循环10时间和回声总是一个。在它内部检查该迭代的$ parts []是否不为空,如果不是则回声。否则它只是没有回音。

你仍然希望所有人都在那里,否则你的桌子会被毁掉(对最终用户来说看起来很奇怪)。

+0

`empty()`仍然会通过警告,因为索引不存在。这里需要`isset()`。 – PiTheNumber 2011-12-14 08:47:04

+0

完美的工作 – MagnusGaarde 2011-12-14 08:48:21

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>'; 
    } 
    } 
} 
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> 
0

undefined offset错误是E_NOTICE,这意味着它可以安全地被忽略。为防止通知出现,请使用:

error_reporting(E_ALL^E_NOTICE); 

如果您不想这样做,有几种方法可以解决该问题。一招将是您的explode行更改为:

$parts = explode(",", $line_of_text.",,,,,,,,,,"); 

这样总是会有至少10份。

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>