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