当我使用fputcsv写一行到打开的文件句柄时,PHP会将一个封闭的字符添加到它认为需要的任何列,但是会留下没有这些外壳的其他列.
例如,您最终可能会得到这样的一行
11,"Bob ",Jenkins,"200 main st. USA ",etc
如果没有将虚假空间附加到每个字段的末尾,是否有任何方法可以强制fputcsv始终用外壳包含列(默认为")"字符?
不,fputcsv()仅在以下条件下包含该字段
/* enclose a field that contains a delimiter, an enclosure character, or a newline */ if (FPUTCSV_FLD_CHK(delimiter) || FPUTCSV_FLD_CHK(enclosure) || FPUTCSV_FLD_CHK(escape_char) || FPUTCSV_FLD_CHK('\n') || FPUTCSV_FLD_CHK('\r') || FPUTCSV_FLD_CHK('\t') || FPUTCSV_FLD_CHK(' ') )
没有"永远封闭"选项.
对这个解决方案不满意,但这是我所做的和工作的.我们的想法是在fputcsv上设置一个空字符作为外壳字符,并在数组的每个元素上添加一些引号.
function encodeFunc($value) { return "\"$value\""; } fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
建立在马丁的回答,如果你想避免将不从源阵列(干任何字符Chr(127)
,Chr(0)
等等),你可以替换,而不是下面的fputcsv()行:
fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
当然,fputs()比fputcsv()慢,但它的输出更清晰.完整的代码是这样的:
/*** * @param $value array * @return string array values enclosed in quotes every time. */ function encodeFunc($value) { ///remove any ESCAPED double quotes within string. $value = str_replace('\\"','"',$value); //then force escape these same double quotes And Any UNESCAPED Ones. $value = str_replace('"','\"',$value); //force wrap value in quotes and return return '"'.$value.'"'; } $fp = fopen("filename.csv", 'w'); foreach($table as $row){ fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n"); } fclose($fp);