str_getcsv в многомерный массив в php

У меня есть значения 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; } 

Итак, что мы здесь делаем?

  • Во-первых, ваши данные CSV разделяются на массив строк с explode
  • Поскольку первая строка в вашем CSV описывает формат данных, она должна быть отделена от фактических строк данных ( explode и unset )
  • Для хранения результатов мы инициализируем новый массив ( $results )
  • Foreach используется для перебора данных по строкам. Для каждой строки:
    • Строка анализируется с помощью 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); }