У меня есть 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