Intereting Posts
Создание быстрой семантической поисковой системы MySQL для частных статей с нуля PHP Script в моих файлах WordPress. Пожалуйста, расшифруйте или помогите мне Удалить Предотвращение загрузки изображения при обновлении Тест соединения PDO PHP-SDK Facebook auth сохраняет перенаправление Изменение содержимого div с помощью раскрывающегося списка, javascript и PHP Laravel не показывает index.php делает эхо равным fputs (STDout)? Получать значения из базы данных с помощью PHP PDO и обновлять ввод для проверки Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean задан в проблеме con el wile PHP Loop для раскрывающегося года Слова после вопросительного знака отсутствуют при нажатии кнопки, чтобы открыть ссылку Ведение всех значений дубликатов ключей при разборе файла .ini PHP mb_ereg_replace не заменяет, пока preg_replace работает по назначению Разница между возвращаемым значением выражения PHP и переменной

Принуждение fputcsv к использованию Enclosure For * all * Fields

Когда я использую 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; } 

Надеюсь, это полезно для кого-то.