PHP Conference Japan 2024

fputcsv

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

fputcsv将行格式化为 CSV 并写入文件指针

描述

fputcsv(
    资源 $stream,
    数组 $fields,
    字符串 $separator = ",",
    字符串 $enclosure = "\"",
    字符串 $escape = "\\",
    字符串 $eol = "\n"
): 整数|false

fputcsv() 将一行(作为 fields 数组传递)格式化为 CSV 并将其(以 eol 结尾)写入指定 stream

参数

stream

文件指针必须有效,并且必须指向由 fopen()fsockopen() 成功打开的文件(并且尚未由 fclose() 关闭)。

fields

一个 字符串 数组。

separator

separator 参数设置字段分隔符。它必须是一个单字节字符。

enclosure

enclosure 参数设置字段包围符。它必须是一个单字节字符。

escape

escape 参数设置转义字符。它必须是一个单字节字符或空字符串。空字符串 ("") 将禁用专有的转义机制。

注意通常,字段内的 enclosure 字符通过重复来转义;但是,可以使用 escape 字符作为替代。因此,对于默认参数值 ""\" 具有相同的含义。除了允许转义 enclosure 字符外,escape 字符没有特殊含义;它甚至不打算转义自身。

警告

从 PHP 8.4.0 开始,依赖于 escape 的默认值已弃用。需要通过位置参数或使用 命名参数 显式提供。

eol

可选的 eol 参数设置自定义行尾序列。

警告

escape 设置为除空字符串 ("") 之外的任何值时,它可能会导致不符合 » RFC 4180 的 CSV 或无法通过 PHP CSV 函数进行往返转换。 escape 的默认值为 "\\",因此建议将其显式设置为空字符串。默认值将在 PHP 的未来版本(不早于 PHP 9.0)中更改。

注意:

如果字段中包含 enclosure 字符,除非它紧跟在 escape 之后,否则它将通过重复来转义。

返回值

返回已写入字符串的长度,或者在失败时返回 false

错误/异常

如果 separatorenclosure 不为一个字节长,则抛出 ValueError

如果 escape 不为一个字节长或空字符串,则抛出 ValueError

变更日志

版本 描述
8.4.0 依赖于 escape 的默认值现已弃用。
8.1.0 添加了可选的 eol 参数。
7.4.0 escape 参数现在也接受空字符串以禁用专有的转义机制。

示例

示例 #1 fputcsv() 示例

<?php

$list
= array (
array(
'aaa', 'bbb', 'ccc', 'dddd'),
array(
'123', '456', '789'),
array(
'"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach (
$list as $fields) {
fputcsv($fp, $fields);
}

fclose($fp);
?>

上面的例子会将以下内容写入 file.csv

aaa,bbb,ccc,dddd
123,456,789
"""aaa""","""bbb"""

参见

添加注释

用户贡献的注释 25 条注释

MagicalTux at ooKoo dot org
17 年前
如果您需要直接将 CSV 文件发送到浏览器,而无需写入外部文件,您可以打开输出并对其使用 fputcsv。

<?php
$out
= fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
mindbench.nl的bl
17 年前
如果您需要将输出保存到变量中(例如,在框架内使用),您可以写入临时内存包装器并检索其内容。

<?php
// 内存中最多保留 5MB 的输出,如果超过此大小,它将自动写入临时文件
$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');

fputcsv($csv, array('blah','blah'));

rewind($csv);

// 将所有内容放入变量中
$output = stream_get_contents($csv);
?>
[email protected]
7年前
有时将CSV行作为字符串获取很有用。例如,将其存储在某个地方,而不是文件系统中。

<?php
function csvstr(array $fields) : string
{
$f = fopen('php://memory', 'r+');
if (
fputcsv($f, $fields) === false) {
return
false;
}
rewind($f);
$csv_line = stream_get_contents($f);
return
rtrim($csv_line);
}
?>
匿名用户
9年前
如果您想为Excel创建UTF-8文件,请使用此方法

$fp = fopen($filename, 'w');
//添加BOM以修复Excel中的UTF-8
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
[email protected]
4年前
请注意,fputcsv并不总是用 enclosure 字符包围字符串。

<?php
$fh
= fopen('file.csv', 'w');

$a = [ 'One 1', 'Two', 'Three 3' ];

fputcsv($fh, $a, "\t");

fclose($fh);
?>

结果文件包含以下行
"One 1" Two "Three 3"

似乎只有包含至少以下字符之一的字符串才会被包围

- 分隔符字符
- enclosure 字符
- 转义字符
- \n (换行符)
- \r (回车符)
- \t (制表符)
- 空格

我希望这能为您节省查找此行为原因所花费的一个小时。
[email protected]
10个月前
为了与标准 (RFC-4180) CSV 文件最大程度兼容,请记住应禁用专有转义机制。即,将可选的第五个参数设置为 ""(空字符串)。
[email protected]
3年前
在所有这些情况下,您都需要一个没有错误的 csv 写入器,并具有自定义记录分隔功能。

<?php
/**
* 自定义 fputcsv
* @param int $handle 文件句柄
* @param mixed[] $fields 要写入的值数组
* @param string $delimiter 字段分隔符
* @param string $enclosure 字段包围符
* @param string $escape_char 转义包围符字符
* @param string $record_seperator
* @return int 写入的字符数
*/
function _fputcsv($handle, $fields, $delimiter = ",", $enclosure = '"', $escape_char = "\\", $record_seperator = "\r\n")
{
$result = [];
foreach (
$fields as $field) {
$result[] = $enclosure . str_replace($enclosure, $escape_char . $enclosure, $field) . $enclosure;
}
return
fwrite($handle, implode($delimiter, $result) . $record_seperator);
}
?>
alex /-\-l- windeagle.org
15年前
制表符分隔。

使用 fputcsv 输出带有制表符分隔符的 CSV 有点棘手,因为分隔符字段只接受一个字符。
答案是使用 chr() 函数。制表符的 ASCII 码是 9,因此 chr(9) 返回一个制表符字符。

<?php
fputcsv
($fp, $foo, '\t'); //不起作用
fputcsv($fp, $foo, ' '); //不起作用

fputcsv($fp, $foo, chr(9)); //起作用
?>

==================

应该是
<?php
fputcsv
($fp, $foo, "\t");
?>
你只是忘记了单引号是字面意思……这意味着你放在那里的任何内容都会输出,所以 '\t' 与 't' 相同,因为在这种情况下 \ 仅用于转义,但如果使用双引号,则会起作用。
Biniam Nigusse
8年前
下面是如何解决将数组转换为csv文件时的编码问题的解决方案。

$fp = fopen('php://memory', 'w');
//添加BOM以修复Excel中的UTF-8
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
// 输出列标题
//fputcsv($fp, array('Topic', 'Title', 'URL', 'Keywords', 'Score', 'FB_count', 'TW_count', '|'));
if(isset($trend)){
foreach ( $trend as $myField ){
fputcsv($fp, $myField, '|');
}
}
[email protected]
13年前
实用程序函数,用于将 mysql 查询输出到 csv,并可以选择写入文件或作为 csv 附件发送回浏览器。

<?php
function query_to_csv($db_conn, $query, $filename, $attachment = false, $headers = true) {

if(
$attachment) {
// 向浏览器发送响应头
header( 'Content-Type: text/csv' );
header( 'Content-Disposition: attachment;filename='.$filename);
$fp = fopen('php://output', 'w');
} else {
$fp = fopen($filename, 'w');
}

$result = mysql_query($query, $db_conn) or die( mysql_error( $db_conn ) );

if(
$headers) {
// 输出标题行(如果至少存在一行)
$row = mysql_fetch_assoc($result);
if(
$row) {
fputcsv($fp, array_keys($row));
// 将指针重置回开头
mysql_data_seek($result, 0);
}
}

while(
$row = mysql_fetch_assoc($result)) {
fputcsv($fp, $row);
}

fclose($fp);
}

// 使用该函数
$sql = "SELECT * FROM table";
// $db_conn 应该是一个有效的数据库句柄

// 作为附件输出
query_to_csv($db_conn, $sql, "test.csv", true);

// 输出到文件系统
query_to_csv($db_conn, $sql, "test.csv", false);
?>
soapergem at gmail dot com
15年前
我创建了一个函数,可以快速生成与 Microsoft 应用程序兼容的 CSV 文件。在实践中,我了解到了一些生成 CSV 文件时并不总是显而易见的事情。首先,由于 PHP 通常基于 *nix 系统,因此行尾符始终为 `\n` 而不是 `\r\n`。但是,某些 Microsoft 程序(例如 Access 97)除非每行以 `\r\n` 结尾,否则无法正确识别 CSV 文件。因此,此函数相应地更改了行尾符。其次,如果 CSV 文件的第一列标题/值以大写字母 ID 开头,某些 Microsoft 程序(例如 Excel 2007)会将其解释为 SYLK 格式而不是 CSV 格式,如下所述:http://support.microsoft.com/kb/323626

此函数也解决了这个问题,通过强制将第一个值用引号括起来(当不自动发生这种情况时)。如果需要,修改此函数以使用其他分隔符将非常简单,我把这个留给读者作为练习。简而言之,此函数用于以对 Windows 应用程序安全的方式将 CSV 数据输出到 CSV 文件。它需要两个参数 + 一个可选参数:应保存文件的位置、数据行数组和可选的列标题数组。(从技术上讲,您可以省略标题数组,而将其作为数据的首行包含在内,但在实践中,将这些数据存储在不同的数组中通常很有用。)

<?php

function mssafe_csv($filepath, $data, $header = array())
{
if (
$fp = fopen($filepath, 'w') ) {
$show_header = true;
if ( empty(
$header) ) {
$show_header = false;
reset($data);
$line = current($data);
if ( !empty(
$line) ) {
reset($line);
$first = current($line);
if (
substr($first, 0, 2) == 'ID' && !preg_match('/["\\s,]/', $first) ) {
array_shift($data);
array_shift($line);
if ( empty(
$line) ) {
fwrite($fp, "\"{$first}\"\r\n");
} else {
fwrite($fp, "\"{$first}\",");
fputcsv($fp, $line);
fseek($fp, -1, SEEK_CUR);
fwrite($fp, "\r\n");
}
}
}
} else {
reset($header);
$first = current($header);
if (
substr($first, 0, 2) == 'ID' && !preg_match('/["\\s,]/', $first) ) {
array_shift($header);
if ( empty(
$header) ) {
$show_header = false;
fwrite($fp, "\"{$first}\"\r\n");
} else {
fwrite($fp, "\"{$first}\",");
}
}
}
if (
$show_header ) {
fputcsv($fp, $header);
fseek($fp, -1, SEEK_CUR);
fwrite($fp, "\r\n");
}
foreach (
$data as $line ) {
fputcsv($fp, $line);
fseek($fp, -1, SEEK_CUR);
fwrite($fp, "\r\n");
}
fclose($fp);
} else {
return
false;
}
return
true;
}

?>
nate at example dot com
16 年前
好了,玩了一段时间后,我相信下面的替换函数在所有情况下都能工作,包括本机 `fputcsv` 函数失败的情况。如果 `fputcsv` 对你不起作用(特别是使用 mysql csv 导入时),请尝试使用此函数作为替代替换。

传递的参数与 `fputcsv` 完全相同,尽管我添加了一个额外的 `$mysql_null` 布尔值,允许将 php null 值转换为可插入 mysql 的 null 值(默认情况下,此附加功能被禁用,因此与 `fputcsv` 完全相同[除了这个可以工作!])。

<?php

function fputcsv2 ($fh, array $fields, $delimiter = ',', $enclosure = '"', $mysql_null = false) {
$delimiter_esc = preg_quote($delimiter, '/');
$enclosure_esc = preg_quote($enclosure, '/');

$output = array();
foreach (
$fields as $field) {
if (
$field === null && $mysql_null) {
$output[] = 'NULL';
continue;
}

$output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field) ? (
$enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure
) : $field;
}

fwrite($fh, join($delimiter, $output) . "\n");
}

// 精确的 LOAD DATA INFILE 命令
// (如果上面为 $delimiter 和/或 $enclosure 传递了不同的值,
// 请在此处也进行更改;但请_保留 ESCAPED BY EMPTY_!)。
/*
LOAD DATA INFILE
'/path/to/file.csv'

INTO TABLE
my_table

FIELDS TERMINATED BY
','

OPTIONALLY ENCLOSED BY
'"'

ESCAPED BY
''

LINES TERMINATED BY
'\n'
*/

?>
ifunk
17 年前
我将这段代码从PHP源代码转换而来。它完全复制了PHP5的功能,而这里其他示例则没有做到。

<?php

if (!function_exists('fputcsv')) {

function
fputcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {
$str = '';
$escape_char = '\\';
foreach (
$fields as $value) {
if (
strpos($value, $delimiter) !== false ||
strpos($value, $enclosure) !== false ||
strpos($value, "\n") !== false ||
strpos($value, "\r") !== false ||
strpos($value, "\t") !== false ||
strpos($value, ' ') !== false) {
$str2 = $enclosure;
$escaped = 0;
$len = strlen($value);
for (
$i=0;$i<$len;$i++) {
if (
$value[$i] == $escape_char) {
$escaped = 1;
} else if (!
$escaped && $value[$i] == $enclosure) {
$str2 .= $enclosure;
} else {
$escaped = 0;
}
$str2 .= $value[$i];
}
$str2 .= $enclosure;
$str .= $str2.$delimiter;
} else {
$str .= $value.$delimiter;
}
}
$str = substr($str,0,-1);
$str .= "\n";
return
fwrite($handle, $str);
}

}

?>
perske at muenster dot de
7年前
为了生成符合 RFC 4180 的输出,不要使用 fputcsv,而是手动编码,如下所示

function rfccsv($arr){
foreach($arr as &$a){
$a=strval($a);
if(strcspn($a,",\"\r\n")<strlen($a))$a='"'.strtr($a,array('"'=>'""')).'"';
}
return implode(',',$arr);
}
echo rfccsv(array(.....))."\n";
julian at polygon dot red
4年前
如果您不想包含字符串(因为您自己正在管理它们或者您的内容已经包含了?),请注意,您不能将空包含传递给 fputcsv。该函数需要一个字符作为该参数。chr(0) 效果很好

fputcsv($handle, $fields, ",", chr(0));
drew at zitnay dot com
20年前
[由 danbrown AT php DOT net 编辑:这是由作者修改后的函数,其中包含一些错误修复和改进。最初的函数示例由 arthur AT mclean DOT ws 编写,之后由 arthur AT korn DOT ch 重写。]

- 调用 str_replace() 时,必须为 $cell 赋值返回值,否则不会保存任何内容

- 使用 strchr() 时,应显式检查 !== FALSE,否则它会将返回值 0(在字符串位置 0 处找到字符)视为 FALSE

- Excel 似乎不仅引用包含逗号的字段,还引用包含引号的字段,所以我为引号添加了另一个 strchr();我并不是说 Microsoft 一定知道正确的方法,但这对我来说似乎是合理的

- 原函数在每个逗号后添加了一个空格;这可能是合法的,我不知道,但我从未见过(而且我认为不是,因为那样的话,您如何才能表示希望字段以空格开头,而不是通过引用它?)

- 原函数没有正确返回输出数据的长度

这是修复后的函数

<?php
function fputcsv($handle, $row, $fd=',', $quot='"')
{
$str='';
foreach (
$row as $cell) {
$cell=str_replace(Array($quot, "\n"),
Array(
$quot.$quot, ''),
$cell);
if (
strchr($cell, $fd)!==FALSE || strchr($cell, $quot)!==FALSE) {
$str.=$quot.$cell.$quot.$fd;
} else {
$str.=$cell.$fd;
}
}

fputs($handle, substr($str, 0, -1)."\n");

return
strlen($str);
}
?>

Drew
simeonl at dbc dot co dot nz
14年前
总的来说,我发现自己希望将结果作为字符串而不是写入文件,特别是希望使用可能与生成它的服务器上的换行符不同的换行符来生成 CSV 文件。这是我在不重写 fputcsv 的情况下解决这个问题的方法。

<?php
function sputcsv($row, $delimiter = ',', $enclosure = '"', $eol = "\n")
{
static
$fp = false;
if (
$fp === false)
{
$fp = fopen('php://temp', 'r+'); //参见 https://php.net/manual/en/wrappers.php.php - 是的,末尾有两个 '.php'
// 注意:你读写到/从 'php://temp' 的任何内容都特定于此文件句柄
}
else
{
rewind($fp);
}

if (
fputcsv($fp, $row, $delimiter, $enclosure) === false)
{
return
false;
}

rewind($fp);
$csv = fgets($fp);

if (
$eol != PHP_EOL)
{
$csv = substr($csv, 0, (0 - strlen(PHP_EOL))) . $eol;
}

return
$csv;
}

// 测试
$rows = array
(
array(
'blue, sky', 'green, lime', 'red', 'black'),
array(
'white', 'gold', 'purple, imperial', 'grey, slate'),
array(
'orange, burnt', 'pink, hot', 'violet', 'indigo'),
);

if (
PHP_EOL == "\r\n")
{
$eol = "\n";
}
else
{
$eol = "\r\n";
}

foreach(
$rows as $row)
{
echo
nl2br(sputcsv($row, ',', '"', $eol));
}
?>

测试应该产生如下内容:

"blue, sky","green, lime",red,black
white,gold,"purple, imperial","grey, slate"
"orange, burnt","pink, hot",violet,indigo
mike at fatica dot net
10年前
我们有一个写入单行 CSV 的函数。我注意到,启用 auto_detect_line_endings 后,fputcsv 不会在文件末尾写入换行符。

启用 auto_detect_line_endings 将 fputcsv 的行为更改为包含换行符。
encode
3年前
关于 Excel 和 UTF-16LE 编码

为了完全兼容 Excel(变音符、西里尔字母、汉字等),需要将 .csv 编码为 UTF-16LE,使用制表符 (\t) 作为分隔符,并在文件开头包含 UTF-16LE BOM。

但是,这不能仅仅通过编码 putcsv 的输入来完成,因为分隔符和引号字符仍然会以默认编码写入,并且 fputcsv 不会接受 utf-16 编码的分隔符/引号字符。

简单的解决方案是自己实现 fputcsv 的转义等功能,或者可能在之后对生成的 .csv 文件进行编码。
alanzhang717 at gmail dot com
11年前
使用 fputcsv 输出 csv 时,如果存在任何汉字,你可能会得到乱码。然后你需要正确设置编码

fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 只需添加这一行
fputcsv($fp, ...);
R dot Mansveld at Spider-IT dot de
11年前
受 boonerunner 函数的启发,我编写了一个更小、更快、更灵活的函数,它也使用了更少的内存。
我还重命名了它以避免与 PHP 函数冲突或覆盖,并像 fputcsv() 一样为第 3 和第 4 个参数提供了默认值。

此函数将所有文本值放在 $enclosure 中,同时在值中加倍 $enclosure,并将数值保留原样。
但是,如果 $delimiter 存在于数值中,此值也将放在 $enclosure 中(如果使用点作为 $delimiter,则可能会发生这种情况)。

function fwritecsv($handle, $fields, $delimiter = ',', $enclosure = '"') {
# 检查 $fields 是否为数组
if (!is_array($fields)) {
return false;
}
# 遍历数据数组
for ($i = 0, $n = count($fields); $i < $n; $i ++) {
# 只“修正”非数值
if (!is_numeric($fields[$i])) {
# 重复值内的 $enclosure 并将值放在 $enclosure 中
$fields[$i] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $fields[$i]) . $enclosure;
}
# 如果 $delimiter 是点 (.),也修正数值
if (($delimiter == '.') && (is_numeric($fields[$i]))) {
# 将值放在 $enclosure 中
$fields[$i] = $enclosure . $fields[$i] . $enclosure;
}
}
# 使用 $delimiter 组合数据数组并将其写入文件
$line = implode($delimiter, $fields) . "\n";
fwrite($handle, $line);
# 返回写入数据的长度
return strlen($line);
}
jon+dontspamme at phpsitesolutions dot com
16 年前
我发现 PHP 4 的 fputcsv 示例缺少一样东西,那就是在 $enclosure 值为引号时对其进行正确处理(如果在字段中传递引号,并且它由斜杠分隔,则此处提交的函数将对其进行不正确的处理)。

我的修改后的函数是使用 fputcsv 的实际 PHP5 源代码构建的,并增加了对正在处理的字段中是否存在分隔符引号的正确反应。

<?php
if (!function_exists('fputcsv')) {
function
fputcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {

// 健全性检查
if (!is_resource($handle)) {
trigger_error('fputcsv() 期望参数 1 为资源,' .
gettype($handle) . '给出', E_USER_WARNING);
return
false;
}

if (
$delimiter!=NULL) {
if(
strlen($delimiter) < 1 ) {
trigger_error('分隔符必须是一个字符', E_USER_WARNING);
return
false;
}elseif(
strlen($delimiter) > 1 ) {
trigger_error('分隔符必须是一个字符', E_USER_NOTICE);
}

/* 使用字符串的第一个字符 */
$delimiter = $delimiter[0];
}

if(
$enclosure!=NULL ) {
if(
strlen($enclosure) < 1 ) {
trigger_error('包围符必须是一个字符', E_USER_WARNING);
return
false;
}elseif(
strlen($enclosure) > 1 ) {
trigger_error('包围符必须是一个字符', E_USER_NOTICE);
}

/* 使用字符串的第一个字符 */
$enclosure = $enclosure[0];
}

$i = 0;
$csvline = '';
$escape_char = '\\';
$field_cnt = count($fields);
$enc_is_quote = in_array($enclosure, array('"',"'"));
reset($fields);

foreach(
$fields AS $field ) {

/* 包含分隔符、包围符或换行符的字段 */
if( is_string($field) && (
strpos($field, $delimiter)!==false ||
strpos($field, $enclosure)!==false ||
strpos($field, $escape_char)!==false ||
strpos($field, "\n")!==false ||
strpos($field, "\r")!==false ||
strpos($field, "\t")!==false ||
strpos($field, ' ')!==false ) ) {

$field_len = strlen($field);
$escaped = 0;

$csvline .= $enclosure;
for(
$ch = 0; $ch < $field_len; $ch++ ) {
if(
$field[$ch] == $escape_char && $field[$ch+1] == $enclosure && $enc_is_quote ) {
continue;
}elseif(
$field[$ch] == $escape_char ) {
$escaped = 1;
}elseif( !
$escaped && $field[$ch] == $enclosure ) {
$csvline .= $enclosure;
}else{
$escaped = 0;
}
$csvline .= $field[$ch];
}
$csvline .= $enclosure;
} else {
$csvline .= $field;
}

if(
$i++ != $field_cnt ) {
$csvline .= $delimiter;
}
}

$csvline .= "\n";

return
fwrite($handle, $csvline);
}
}
?>
David Thomas
13年前
将XML字符串输出为CSV,第一行为列标题

<?php

// 在这种情况下,XML 是
// <records>
// <record>...</record>
// <record>...</record>
// </records>

if($xml = simplexml_load_string($string)){
// 保持最多12MB内存,如果超过则写入临时文件
$file = fopen('php://temp/maxmemory:'. (12*1024*1024), 'r+');
if(
$row = get_object_vars($xml->record[0])){ // 第一条记录
// 第一行包含列标题值
foreach($row as $key => $value){
$header[] = $key;
}
fputcsv($file, $header,',','"');
foreach (
$xml->record as $record) {
fputcsv($file, get_object_vars($record),',','"');
}
rewind($file);
$output = stream_get_contents($file);
fclose($file);
return
$output;
}else{
return
'';
}
}

?>
mnz
5年前
希望这能有所帮助…

在某些服务器配置中,关联数组不起作用。在我的情况下,脚本停止运行,没有任何错误或消息,`fputcsv` 只返回“false”。

在本地设置中,关联数组可以工作,但在生产服务器上不行。只需删除键值即可解决问题。

因此,最好在调用 `fputcsv()` 之前去除键值。

<?php

// 从数组中删除键值

$csv_fields = array();

foreach(
$associative_array as $value) {
$csv_fields[] = $value;
}

fputcsv( $handler, $csv_fields);

?>
boonerunner at hotmail dot com
19年前
这是一个对上述代码的改编,它增加了对字段内双引号的支持。(根据 CSV 格式,一个双引号将被替换为一对双引号)。

<?php
function fputcsv($filePointer,$dataArray,$delimiter,$enclosure)
{
// 向文件写入一行
// $filePointer = 要写入的文件资源
// $dataArray = 要写入的数据
// $delimeter = 字段分隔符

// 构建字符串
$string = "";

// 没有前导分隔符
$writeDelimiter = FALSE;
foreach(
$dataArray as $dataElement)
{
// 将双引号替换为两个双引号
$dataElement=str_replace("\"", "\"\"", $dataElement);

// 在每个字段前添加分隔符(第一个字段除外)
if($writeDelimiter) $string .= $delimiter;

// 用 $enclosure 括起每个字段并将其添加到字符串
$string .= $enclosure . $dataElement . $enclosure;

// 除第一个字段外,每次都使用分隔符。
$writeDelimiter = TRUE;
}
// end foreach($dataArray as $dataElement)

// 添加换行符
$string .= "\n";

// 将字符串写入文件
fwrite($filePointer,$string);
}
?>
To Top