Подтвердить что ты не робот

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 является динамическим.

4b9b3361

Ответ 1

Предполагая, что каждая строка в 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);
}

Ответ 2

Вот полное решение:

$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 используется для перебора данных по строкам. Для каждой строки:
    • Строка анализируется с помощью PHP str_getcsv
    • Инициализирован пустой массив результатов
    • Каждая строка проверяется с учетом формата. Клетки добавляются, а отсутствующие столбцы заполняются пустыми строками.

Ответ 3

Вот очень чистое и простое решение:

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);
}