У меня есть значения csv:
$csv_data = "test,this,thing hi,there,this is,cool,dude have,fun";
Я хочу взять целую строку CSV и прочитать ее в многомерном массиве, чтобы получить:
array( array( 'test' => 'hi', 'this' => 'there', 'thing' => 'this' ), array( 'test' => 'is', 'this' => 'cool', 'thing' => 'dude' ), array( 'test' => 'have', 'this' => 'fun', 'thing' => '' ) );
Я хочу такой вывод, обратите внимание, что значение CSV является динамическим.
Предполагая, что каждая строка в CSV-данных имеет одинаковое количество столбцов, это должно работать.
$lines = explode("\n", $csv_data); $head = str_getcsv(array_shift($lines)); $array = array(); foreach ($lines as $line) { $array[] = array_combine($head, str_getcsv($line)); }
Если строки имеют переменное количество столбцов (как в вашем примере, где последняя строка содержит 2 столбца вместо 3), используйте этот цикл:
foreach ($lines as $line) { $row = array_pad(str_getcsv($line), count($head), ''); $array[] = array_combine($head, $row); }
Вот полное решение:
$lines = explode("\n", $csv_data); $formatting = explode(",", $lines[0]); unset($lines[0]); $results = array(); foreach ( $lines as $line ) { $parsedLine = str_getcsv( $line, ',' ); $result = array(); foreach ( $formatting as $index => $caption ) { if(isset($parsedLine[$index])) { $result[$formatting[$index]] = trim($parsedLine[$index]); } else { $result[$formatting[$index]] = ''; } } $results[] = $result; }
не$lines = explode("\n", $csv_data); $formatting = explode(",", $lines[0]); unset($lines[0]); $results = array(); foreach ( $lines as $line ) { $parsedLine = str_getcsv( $line, ',' ); $result = array(); foreach ( $formatting as $index => $caption ) { if(isset($parsedLine[$index])) { $result[$formatting[$index]] = trim($parsedLine[$index]); } else { $result[$formatting[$index]] = ''; } } $results[] = $result; }
Итак, что мы здесь делаем?
explode
explode
и unset
) $results
) str_getcsv
PHP Вот очень чистое и простое решение:
function parse_row($row) { return array_map('trim', explode(',', $row)); } $rows = str_getcsv($csv_data, "\n"); $keys = parse_row(array_shift($rows)); $result = array(); foreach ($rows as $row) { $row = parse_row($row); $row = array_pad($row, 3, NULL); $result[] = array_combine($keys, $row); }