Чтение CSV в массив PHP

У меня есть PHP-процедура, которая читает CSV-файл, который был загружен на мой сайт.

Количество полей в файле может отличаться от загрузки для загрузки.

Я хочу иметь возможность установить размер CSV-файла (количество полей), а затем сохранить его содержимое в массиве.

Это то, что у меня есть до сих пор:

//get the csv file $file = $_FILES[csv1][tmp_name]; $handle = fopen($file,"r"); //loop through the csv file and insert into array $dataline = fgetcsv($handle,1000,",","'"); $fieldnum = count($dataline); $recordloop = 0; while ($dataline) { for ($fieldloop=0; $fieldloop <$fieldnum; $fieldloop++) { //this is the bit that is wrong $dataarray[]=array($dataline[$fieldloop]); } $data = fgetcsv($handle,1000,",","'"); $recordloop++; } 

Если, например, есть 30 полей и 200 записей, я пытаюсь получить массив структуры $dataarray[200][30] .

Как получить данные в массив этой структуры?

Пример .csv:

 Row 1 will be field headings Name, Gender, Ethnicity, DOB, etc .... the number of fields is not fixed - it could be from 30 to 40 fields in this row Rows 2 onwards will be the records John, M, British, 10/04/49, etc Simon, M, British, 04/03/65, etc 

ОТВЕТ – сделал то, что хотел

 $file = $_FILES[csv1][tmp_name]; $handle = fopen($file,"r"); $matrix = array(); while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) { $matrix[] = $row; } 

У вас уже есть такая реализация в PHP:

 $csv = array_map('str_getcsv', file('someCSVfile.csv')); 

Объяснение:

  • str_getcsv()str_getcsv() строку CSV в массив.
  • file() – Читает весь файл в массив.
  • array_map(Function, Array) – возвращает массив, содержащий все элементы массива, после применения функции обратного вызова к каждому из них.

Пример вывода:

 //CSV NAME,CLASS,ROOM Sally,2018,312 Belinda,2017,148 //OUTPUT: Array( [0] => Array([0] => NAME, [1] => CLASS, [2] => ROOM), [1] => Array([0] => Sally, [1] => 2018, [2] => 312), [2] => Array([0] => Belinda, [1] => 2017, [2] => 148) ) 

Ассоциативные ключи

Две быстрых функции для анализа с помощью ассоциативных ключей – оба основаны на методе array_map :

МЕТОД 1: выполняется дважды

 function assoc_getcsv($csv_path) { $r = array_map('str_getcsv', file($csv_path)); foreach( $r as $k => $d ) { $r[$k] = array_combine($r[0], $r[$k]); } return array_values(array_slice($r,1)); } 

МЕТОД 2: один раз

 function assoc_getcsv($csv_path) { $f = array(); function parse_csv_assoc($str,&$f){ if (empty($f)) { $f = str_getcsv($str); } return array_combine($f, str_getcsv($str)); } return array_values(array_slice(array_map('parse_csv_assoc', file($csv_path), $f),1)); } 

Пример вывода:

 //CSV NAME,CLASS,ROOM Sally,2018,312 Belinda,2017,148 //OUTPUT: Array( [0] => Array([NAME] => Sally, [CLASS] => 2018, [ROOM] => 312), [1] => Array([NAME] => Belinda, [CLASS] => 2017, [ROOM] => 148) ) 

эта функция будет считывать CSV и генерировать многомерный массив

 function fromCSVFile( $file) { // open the CVS file $handle = @fopen( $file, "r"); if ( !$handle ) { throw new \Exception( "Couldn't open $file!" ); } $result = []; // read the first line $first = strtolower( fgets( $handle, 4096 ) ); // get the keys $keys = str_getcsv( $first ); // read until the end of file while ( ($buffer = fgets( $handle, 4096 )) !== false ) { // read the next entry $array = str_getcsv ( $buffer ); if ( empty( $array ) ) continue; $row = []; $i=0; // replace numeric indexes with keys for each entry foreach ( $keys as $key ) { $row[ $key ] = $array[ $i ]; $i++; } // add relational array to final result $result[] = $row; } fclose( $handle ); return $result; } 

Поэтому, если ваш файл .CSV выглядит так:

 Name,Gender,Ethnicity,DOB John,M,British,10/04/49 Simon,M,British,04/03/65 

Вы получите следующее:

 ( [0] => Array ( [name] => John [gender] => M [ethnicity] => British [dob] => 10/04/49 ) [1] => Array ( [name] => Simon [gender] => M [ethnicity] => British [dob] => 04/03/65 ) ) 

1.csv:

 Name,Gender,Ethnicity,DOB John,M,British,10/04/49 Simon,M,British,04/03/65 

Используйте file() чтобы прочитать файл csv в массив, затем перебрать этот массив и получить все поля в элемент массива с помощью explode() и создать новый $array

 <?php $file = '1.csv'; $content = file($file); $array = array(); for($i = 1; $i < count($content); $i++) { $line = explode(',', $content[$i]); for($j = 0; $j < count($line); $j++) { $array[$i][$j + 1] = $line[$j]; } } print_r($array); ?> 

Вывод:

 Array ( [1] => Array ( [1] => John [2] => M [3] => British [4] => 10/04/49 ) [2] => Array ( [1] => Simon [2] => M [3] => British [4] => 04/03/65 ) ) 

Если вы хотите получить запись: 2 и поле: 4, вы можете сделать это:

 echo $array[2][4]; 

Вывод:

 04/03/65