Когда я использую 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);
После большого количества scrafffing вокруг и некоторой несколько утомительной проверки персонажа, у меня есть версия вышеупомянутых ссылок на коды Диего и Махна, которые будут правильно fputcsv
и заменять двойными кавычками во всех полях в fputcsv
. а затем вывести файл в браузер для загрузки.
У меня также была второстепенная проблема: не быть уверенным, что двойные кавычки всегда / никогда не исчезали.
В частности, при выводе непосредственно в браузер с использованием входного потока php: // по ссылке Диего. Chr(127)
является символом пробела, поэтому файл CSV имеет несколько пробелов, чем в противном случае, но я считаю, что это оборачивает проблему chr(0)
NULL символов в UTF-8.
/*** * @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.'"'; } $result = $array_Set_Of_DataBase_Results; $fp = fopen('php://output', 'w'); if ($fp && $result) { header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="export-'.date("dmY").'.csv"'); foreach($result as $row) { fputcsv($fp, array_map("encodeFunc", $row), ',', chr(127)); } unset($result,$row); die; }
с/*** * @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.'"'; } $result = $array_Set_Of_DataBase_Results; $fp = fopen('php://output', 'w'); if ($fp && $result) { header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="export-'.date("dmY").'.csv"'); foreach($result as $row) { fputcsv($fp, array_map("encodeFunc", $row), ',', chr(127)); } unset($result,$row); die; }
Надеюсь, это полезно для кого-то.