使用PHP将CSV转换为JSON?

Ver*_*onW 10 php csv ajax json curl

我需要使用PHP 将CSV文件转换为服务器上的JSON.我正在使用这个有效的脚本:

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;
Run Code Online (Sandbox Code Playgroud)

$csv变量是由cURL请求产生的字符串,该请求返回CSV内容.

我确信这不是最有效的PHP代码,因为我是一名初学者,而且我对PHP的了解很少.有没有更好,更有效的方法使用PHP将CSV转换为JSON?

提前致谢.

注意.我知道我正在添加空格然后删除它,我这样做,所以我可以选择通过删除行来返回"可读"JSON以$json = preg_replace('/[ \n]/', '', $json);进行测试.

编辑.感谢您的回复,基于它们,新代码如下:

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;
Run Code Online (Sandbox Code Playgroud)

mar*_*rio 23

那么有json_encode()函数,您应该使用它而不是自己构建JSON输出.并且还有一个用于解析CSV的函数str_getcsv():

$array = array_map("str_getcsv", explode("\n", $csv));
print json_encode($array);
Run Code Online (Sandbox Code Playgroud)

但是,如果希望JSON输出保存命名字段,则必须调整$数组.


Joe*_*e P 6

我修改了问题中的答案,使用CSV的第一行作为数组键.这样做的好处是不必对函数中的密钥进行硬编码,从而允许它适用于任何带有列标题和任意列数的CSV.

这是我的修改版本:

function csvToJson($csv) {
    $rows = explode("\n", trim($csv));
    $data = array_slice($rows, 1);
    $keys = array_fill(0, count($data), $rows[0]);
    $json = array_map(function ($row, $key) {
        return array_combine(str_getcsv($key), str_getcsv($row));
    }, $data, $keys);

    return json_encode($json);
}
Run Code Online (Sandbox Code Playgroud)