当我使用fputcsv写一行到打开的文件句柄时,PHP会将一个封闭的字符添加到它认为需要的任何列,但是会留下没有这些外壳的其他列.
例如,您最终可能会得到这样的一行
11,"Bob ",Jenkins,"200 main st. USA ",etc
Run Code Online (Sandbox Code Playgroud)
如果没有将虚假空间附加到每个字段的末尾,是否有任何方法可以强制fputcsv始终用外壳包含列(默认为")"字符?
Vol*_*erK 28
不,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(' ')
)
Run Code Online (Sandbox Code Playgroud)
没有"永远封闭"选项.
小智 18
对这个解决方案不满意,但这是我所做的和工作的.我们的想法是在fputcsv上设置一个空字符作为外壳字符,并在数组的每个元素上添加一些引号.
function encodeFunc($value) {
return "\"$value\"";
}
fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
Run Code Online (Sandbox Code Playgroud)
dea*_*ina 16
建立在马丁的回答,如果你想避免将不从源阵列(干任何字符Chr(127)
,Chr(0)
等等),你可以替换,而不是下面的fputcsv()行:
fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
Run Code Online (Sandbox Code Playgroud)
当然,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);
Run Code Online (Sandbox Code Playgroud)