PHP: взорвать файл и выводить только те части, которые имеют значение - PullRequest
0 голосов
/ 14 декабря 2011

Php noob.

У меня есть этот текстовый файл (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 [] будет пустым и нечего выводить, и я получаю ошибку. Неопределенное смещение. Как бы я поступил так и только "повторил" $ parts [], когда он имеет значение?

Ответы [ 5 ]

1 голос
/ 14 декабря 2011

Вы можете использовать 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 голосов
/ 14 декабря 2011
<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>
0 голосов
/ 14 декабря 2011

Ошибка undefined offset - E_NOTICE, что означает, что ее можно безопасно игнорировать. Чтобы предотвратить появление уведомлений, используйте:

error_reporting(E_ALL ^ E_NOTICE);

Если вы не хотите этого делать, есть несколько способов решить проблему. Один трюк состоит в том, чтобы изменить вашу explode строку на:

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

такой, что всегда будет не менее 10 частей.

0 голосов
/ 14 декабря 2011

Вместо того, чтобы отображать все известные вам части (10 строк), вы можете заменить их на что-то вроде этого:

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

Что он делает: цикл 10 раз и эхо всегдаан.Внутри он проверяет, является ли $ parts [] для этой итерации не пустым, и если нет, повторяет его.Иначе это просто ничего не значит.

Вы все еще хотите, чтобы все было там, иначе ваш стол испортится (будет выглядеть странно для конечного пользователя).

0 голосов
/ 14 декабря 2011
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>';
    }
  }
}
...