2011-12-14 43 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>