Сделать таблицу с несколькими столбцами из файла CSV с помощью PHP

Я пытаюсь создать таблицу с несколькими столбцами из файла CSV с помощью PHP. Я бы хотел, чтобы ячейки таблицы отображались по вертикали. Например, если у меня есть файл CSV с именами:

bill mike sarah steve kim dave 

Предполагая, что мне нужны 2 столбца, я бы хотел, чтобы таблица отображалась вертикально следующим образом:

 bill steve mike kim sarah dave 

Я НЕ хочу, чтобы таблица отображалась по горизонтали, например:

 bill mike sarah steve kim dave 

Я использовал следующий код, чтобы сделать одну таблицу столбцов из файла CSV имен игроков, имена команд – и я также передал атрибут позиции команды. Я хотел бы иметь возможность разбивать столбец вертикально на 3 столбца. Вот код:

 <?PHP $file_handle = fopen("CSV Team Example.csv", "r"); echo "<table border = '0' cellspacing='1' cellpadding='3'>\n"; while (!feof($file_handle) ) { $line_of_text = fgetcsv($file_handle); echo "<tr>\n<td width = '200' position = '" . $line_of_text[2] . "'>". $line_of_text[0]. " <br> &nbsp;" . $line_of_text[1] . "</td>\n</tr>\n"; } fclose($file_handle); echo "</table>"; ?> 

Вот файл CSV, над которым я работаю. Заранее благодарю вас за ваше внимание.

CSV-файл:

 Scott L. Aranda,Red Devils,Offense Todd D. Smith,Blue Streaks,Offense Edward M. Grass,Red Devils,Defense Aaron G. Frantz,Blue Streaks,Defense Ryan V. Turner,Red Devils,Offense Belinda J. Bridges,Red Devils,Defense Raymond P. Webb,Blue Streaks,Offense Allison M. Elwell,Blue Streaks,Defense Melinda B. Savino,Blue Streaks,Offense Wendy R. Lane,Red Devils,Offense Gordon Q. Farmer,Blue Streaks,Defense William F. Lawrence,Red Devils,Offense Christa L. Limones,Blue Streaks,Offense Sandra C. Singleton,Red Devils,Offense Keshia M. Garcia,Blue Streaks,Defense Margaret A. Arnold,Red Devils,Defense Paul S. Gonzalez,Blue Streaks,Offense Mark V. Stocks,Red Devils,Defense Elizabeth J. Quinn,Red Devils,Offense Rusty M. Collette,Red Devils,Offense Myra L. Armstrong,Blue Streaks,Defense William B. Stewart,Blue Streaks,Defense Erin J. Hoch,Red Devils,Defense Robin S. Meredith,Blue Streaks,Offense Sherie D. Lee,Red Devils,Offense Michael A. Whitney,Blue Streaks,Defense Louis R. Ochoa,Red Devils,Defense Paul R. Garcia,Blue Streaks,Offense Chester A. Bailey,Red Devils,Defense Johnny B. Coover,Red Devils,Defense Emily K. Wright,Red Devils,Offense Perry D. Desmarais,Red Devils,Offense Judie J. Burns,Blue Streaks,Defense Martin L. Dunn,Blue Streaks,Defense Stephanie C. Rose,Blue Streaks,Defense Don T. Grimes,Blue Streaks,Offense Robert C. Devito,Blue Streaks,Offense Michael J. Taylor,Red Devils,Defense Melissa D. Bush,Red Devils,Offense 

Сначала сначала просмотрите весь файл в массив элементов, затем разделите массив на части X (где X – количество столбцов, которые вы хотите), а затем выведите один элемент из каждой части в строку, повторяя для каждой строки.

Ваш текущий подход вывода в том же цикле, который вы читаете из файла, не будет работать для того, как вы пытаетесь его разбить, так как вы не знаете, какой будет первый элемент в столбце 2, пока вы не увидите все предметы.

Извините, я не понял этот вопрос.

 $csv = 'bill,mike,sarah,steve,kim,dave'; $csv = str_getcsv(implode(',', explode("\n", trim($csv))), ',', ''); $columns = 2; echo '<table border="1" cellspacing="1" cellpadding="3">'; for ($i = 0; $i < count($csv) / $columns; $i++) { echo '<tr>'; for ($j = 0; $j < $columns; $j++) { echo '<td width="200">' . $csv[$i + ($j * ($columns + 1))] . '</td>'; } echo '</tr>'; } echo '</table>'; 

Возвращает:

 bill steve mike kim sarah dave 

см. следующий псевдокод, вы можете избежать расщепления и копирования массива с помощью оператора mod в php.

Изменить: Забыл инициализировать переменную $ numcols !! должен работать для любого количества столбцов

 echo '<table>'; $f = file('..'); $numcols = 2; for($i=0;$i<count($f);$i++) { $data = str_getcsv($f[$i]); if($i % $numcols == 0) echo '<tr>'; // cell diplay here.. echo '<td>' . $data[???] . '</td>'; if($i+1 < count($f) && ($i+1 % $numcols) == 0) echo '</tr>'; } echo '</table>'; 

или вариации этого.

Большое вам спасибо за вашу помощь. Мне удалось получить эту работу, создав массив, предложенный выше. Код немного уродлив, но он выполняет эту работу – я довольно много новичок в php, и я собрал это вместе из примеров, которые я нашел в Интернете.

Последний вопрос, я использую функцию разрыва для разделения CSV-файла на основе запятых. Я боюсь, что это не сработает, если одно из моих полей имеет несколько запятых, например адрес: 123 elm street, bethesda, maryland 20816. Я бы предпочел использовать fgetcsv при создании массива, но я не уверен как это сделать. Кто-нибудь может мне помочь?

Кроме того, str_getcsv, похоже, не поддерживается версией php в моей службе хостинга, поэтому она не работает для меня.

Вот код, который я использовал до сих пор – он дает мне отличный результат, основанный на моем простом файле CSV, который я опубликую снова ниже.

Код:

 <?PHP // set the number of columns you want $columns = 4; // count up number of lines in your CSV file $file_handle = fopen("CSV Team Example.csv", "r"); $row = 0; while (!feof($file_handle) ) { $line_of_text = fgetcsv($file_handle, 1024); $row++; } $number_of_rows = $row; fclose($file_handle); // calculate number of rows per column $rows_per_column = ceil($number_of_rows / $columns); // create your array $lines =file('CSV Team Example.csv'); foreach($lines as $data) { list($name[],$team[],$team_position[]) = explode(',',$data); } // make your table echo "<TABLE BORDER=\"0\">\n"; //here we changed the condition to $i < $rows_per_column for($i = 0; $i < $rows_per_column; $i++) { echo "<TR>\n"; //here will run another loop for the amount of columns for($j = 0; $j < $columns; $j++) { echo "<td width = '200' position = '" . $team_position[$i + ($j * $rows_per_column)] . "'>". $name[$i + ($j * $rows_per_column)] . " <br> &nbsp;" . $team [$i + ($j * $rows_per_column)] . "</td>\n"; } echo "</TR>\n"; } echo "</TABLE>\n"; ?> 

Вот мой CSV-файл: CSV Team Example.csv. Первый столбец – имя игрока, второй столбец – имя команды, а третий столбец – позиция, в которую они играют.

 Scott L. Aranda,Red Devils,Offense Todd D. Smith,Blue Streaks,Offense Edward M. Grass,Red Devils,Defense Aaron G. Frantz,Blue Streaks,Defense Ryan V. Turner,Red Devils,Offense Belinda J. Bridges,Red Devils,Defense Raymond P. Webb,Blue Streaks,Offense Allison M. Elwell,Blue Streaks,Defense Melinda B. Savino,Blue Streaks,Offense Wendy R. Lane,Red Devils,Offense Gordon Q. Farmer,Blue Streaks,Defense William F. Lawrence,Red Devils,Offense Christa L. Limones,Blue Streaks,Offense Sandra C. Singleton,Red Devils,Offense Keshia M. Garcia,Blue Streaks,Defense Margaret A. Arnold,Red Devils,Defense Paul S. Gonzalez,Blue Streaks,Offense Mark V. Stocks,Red Devils,Defense Elizabeth J. Quinn,Red Devils,Offense Rusty M. Collette,Red Devils,Offense Myra L. Armstrong,Blue Streaks,Defense William B. Stewart,Blue Streaks,Defense Erin J. Hoch,Red Devils,Defense Robin S. Meredith,Blue Streaks,Offense Sherie D. Lee,Red Devils,Offense Michael A. Whitney,Blue Streaks,Defense Louis R. Ochoa,Red Devils,Defense Paul R. Garcia,Blue Streaks,Offense Chester A. Bailey,Red Devils,Defense Johnny B. Coover,Red Devils,Defense Emily K. Wright,Red Devils,Offense Perry D. Desmarais,Red Devils,Offense Judie J. Burns,Blue Streaks,Defense Martin L. Dunn,Blue Streaks,Defense Stephanie C. Rose,Blue Streaks,Defense Don T. Grimes,Blue Streaks,Offense Robert C. Devito,Blue Streaks,Offense Michael J. Taylor,Red Devils,Defense Melissa D. Bush,Red Devils,Offense 

Хорошо, он работал только с fgetcsv – не использовалась функция «взорваться». Всем спасибо.

 <?PHP $columns = 4; $file = fopen('CSV Team Example.csv', 'r'); $row = 0; while (($line = fgetcsv($file)) !== FALSE) { //$line is an array of the csv elements list($name[], $team[], $team_position[]) = $line; $row++; } $number_of_rows = $row; fclose($file); // calculate number of rows per column $rows_per_column = ceil($number_of_rows / $columns); // make your table echo "<TABLE BORDER=\"0\">\n"; //here we changed the condition to $i < $rows for($i = 0; $i < $rows_per_column; $i++) { echo "<TR>\n"; //here will run another loop for the amount of columns for($j = 0; $j < $columns; $j++) { echo "<td width = '200' position = '" . $team_position[$i + ($j * $rows_per_column)] . "'>". $name[$i + ($j * $rows_per_column)] . " <br> &nbsp;" . $team[$i + ($j * $rows_per_column)] . "</td>\n"; } echo "</TR>\n"; } echo "</TABLE>\n"; ?>