我的数组到csv函数是否正确?

时间:2011-12-15 00:48:40

标签: php

PHP有a function for converting CSV strings to PHP arrays,但不是函数,反之亦然,所以我写了一篇:

function echocsv(array $arr, $quo = '"', $sep = ',') {
    $escape = $quo . $quo;
    foreach($arr as &$val) {
        if(strpos($val, $quo) !== false) {
            $val = $quo . str_replace($quo, $escape, $val) . $quo;
        }
    }
    echo implode($sep, $arr) . PHP_EOL;
}

有什么我可以忽略的吗?从wikipedia它基本上说引号应该用另一个引号转义,而这几乎就是它的全部内容。 .CSV文件需要在MS Excel中打开。

我的原始测试似乎表明它正在发挥作用。

(我正在回应它,而不是返回一个字符串,因为我要将它直接传输到浏览器)

3 个答案:

答案 0 :(得分:7)

$stdout = fopen('php://output','w'); // 'stdout' is for CLI, 'output' is for Browser
fputcsv($stdout, array('val,ue1','val"ue2','value3','etc'));
fflush($stdout); // flush for fun :)
fclose($stdout);

^ 将CSV输出到浏览器

答案 1 :(得分:6)

PHP确实包含您需要的功能:fputcsv()

要流式传输到浏览器,请使用stdout作为“文件”:

$stdout = fopen('php://stdout','w');
fputcsv($stdout, array('val,ue1','val"ue2','value3','etc'));
fclose($stdout);

答案 2 :(得分:3)

您还需要检查$val是否包含$sep(即如果字符串包含逗号,则引用该字符串):

if (strpos($val, $quo) !== false || strpos($val, $sep) !== false) {
    ...
}

否则,fputcsv()将完成工作(但仅限于文件/流)。