Necesito convertir un archivo CSV a JSON en el servidor usando PHP. Estoy usando este script que funciona:CSV a JSON con PHP?
function csvToJSON($csv) {
$rows = explode("\n", $csv);
$i = 0;
$len = count($rows);
$json = "{\n" . ' "data" : [';
foreach ($rows as $row) {
$cols = explode(',', $row);
$json .= "\n {\n";
$json .= ' "var0" : "' . $cols[0] . "\",\n";
$json .= ' "var1" : "' . $cols[1] . "\",\n";
$json .= ' "var2" : "' . $cols[2] . "\",\n";
$json .= ' "var3" : "' . $cols[3] . "\",\n";
$json .= ' "var4" : "' . $cols[4] . "\",\n";
$json .= ' "var5" : "' . $cols[5] . "\",\n";
$json .= ' "var6" : "' . $cols[6] . "\",\n";
$json .= ' "var7" : "' . $cols[7] . "\",\n";
$json .= ' "var8" : "' . $cols[8] . "\",\n";
$json .= ' "var9" : "' . $cols[9] . "\",\n";
$json .= ' "var10" : "' . $cols[10] . '"';
$json .= "\n }";
if ($i !== $len - 1) {
$json .= ',';
}
$i++;
}
$json .= "\n ]\n}";
return $json;
}
$json = csvToJSON($csv);
$json = preg_replace('/[ \n]/', '', $json);
header('Content-Type: text/plain');
header('Cache-Control: no-cache');
echo $json;
La variable $csv
es una cadena que resulta de una solicitud cURL que devuelve el contenido de CSV.
Estoy seguro de que este no es el código PHP más eficiente para hacerlo porque soy un desarrollador principiante y mi conocimiento de PHP es bajo. ¿Existe una manera mejor y más eficiente de convertir CSV a JSON utilizando PHP?
Gracias de antemano.
Nota. Soy consciente de que estoy agregando espacio en blanco y luego lo eliminé, lo hago así que puedo tener la opción de devolver JSON "legible" quitando la línea $json = preg_replace('/[ \n]/', '', $json);
con fines de prueba.
Editar. Gracias por sus respuestas, basadas en ellos el nuevo código es así:
function csvToJson($csv) {
$rows = explode("\n", trim($csv));
$csvarr = array_map(function ($row) {
$keys = array('var0','var1','var2','var3','var4','var5','var6','var7','var8','var9','var10');
return array_combine($keys, str_getcsv($row));
}, $rows);
$json = json_encode($csvarr);
return $json;
}
$json = csvToJson($csv);
header('Content-Type: application/json');
header('Cache-Control: no-cache');
echo $json;
Muchas gracias, este es un muy limpia solución, edité mi publicación con el código que estoy usando ahora en función de su respuesta más agregué array_combine para dar salida a JSON con nombres de propiedad. – VerizonW
@VerizonW: Usar el cierre también es un truco muy bueno. – mario
+1 Eso me gusta. No sabía sobre 'str_getcsv'. Si también sabe cómo evitar la ruptura de celdas multilínea ...: D – kaiser