PHP不使用最后一个换行符写入文件

PHP不使用最后一个换行符写入文件,php,arrays,csv,Php,Arrays,Csv,我想读取CSV数据文件,将其加载到数组中,编辑并将其写回文件。我已经能够通过Stackoverflow上的示例在一次迭代中完成这一点!谢谢 问题是,当我将新数据写回文件时,我尝试将编辑过的数组写回文件的两种方法都会在文件末尾添加一个换行符。这会在第二次加载CSV文件数据时产生问题。第二次读取会导致数组中出现空索引,从而在写入文件时导致错误 示例#1: 示例2: 这是原始csv数据: 1/1/16,Yes,No 1/2/16,No,Yes 2016年1月1日,是,不是 2016年1月2日,不,是

我想读取CSV数据文件,将其加载到数组中,编辑并将其写回文件。我已经能够通过Stackoverflow上的示例在一次迭代中完成这一点!谢谢

问题是,当我将新数据写回文件时,我尝试将编辑过的数组写回文件的两种方法都会在文件末尾添加一个换行符。这会在第二次加载CSV文件数据时产生问题。第二次读取会导致数组中出现空索引,从而在写入文件时导致错误

示例#1:

示例2:

这是原始csv数据:

1/1/16,Yes,No 1/2/16,No,Yes 2016年1月1日,是,不是 2016年1月2日,不,是 当使用上述命令写入时,它会生成带有添加换行符的数据:

1/1/16,Yes,No 1/2/16,No,Yes 2016年1月1日,是,不是 2016年1月2日,不,是 这一额外的新行在第二次读取文件时会产生问题。我在
fputcsv()
内爆()
上都出现错误。我相信这是因为当我在第一次写入后第二次读取文件时,换行符导致了空索引

内爆()
示例1中,我可以使用带有最后一个
fwrite()
条件的for循环,但这样做似乎很笨拙,而且不是这样做的


也许有一种完全不同的方法来处理这个问题?

这是

fputcsv()将一行(作为字段数组传递)格式化为CSV,并将其写入(以换行符终止)指定的文件句柄

由于所有行都以换行符结尾,因此在文件末尾将有一个额外的空行


您应该为第二次读取(最后一行产生问题)应用修复程序,方法是在处理前检查该行是否为空。

如果要防止在文件末尾添加新行,您可以在需要新行的位置(以及不需要的位置)构建数据集,然后写入一次:

$writeStuff = [];
foreach($editArray as $row) {
    $writeStuff[] = implode(',', $row);
}
fwrite($file_handle, implode(PHP_EOL, $writeStuff));
此外,我不确定如何加载该文件,但您始终可以跳过空行-下面是一个示例:

$editArray = file('your_filename.csv', FILE_IGNORE_NEW_LINES |  FILE_SKIP_EMPTY_LINES);

根据建议,我在读取和加载文件时寻找解决方案,而不是在编写文件时

这些就是我想出的解决办法

第一种选择:

while(! feof($file_handle)) {
    $tmp = fgetcsv($file_handle);
    if($tmp != NULL) {
        $myArray[] = $tmp;
    }
}
如果行为空,fgetcsv将返回NULL

第二种选择。放弃文件()的fgetcsv()。它忽略了没有测试的空换行符

$data_Array = file($file);

foreach($$data_Array as $key) {
    $myArray[] = explode(",", $key);
}

这似乎奏效了。此外,前面给出的内爆()和PHP_EOL的示例似乎也可以使用。我可能遗漏了一些东西,但这些暂时还有效

如何读取文件?我看不出任何方法可以添加额外的换行符,除非
$editArray
的最后一个元素以换行符结尾,而其他元素则没有。在第一个示例中,您在最后一个语句中显式地写了一个换行符。这就是你在结尾处得到额外换行的原因吗?谢谢你的回复。经过处理前的建议检查,我提出了两种解决方案。
while(! feof($file_handle)) {
    $tmp = fgetcsv($file_handle);
    if($tmp != NULL) {
        $myArray[] = $tmp;
    }
}
$data_Array = file($file);

foreach($$data_Array as $key) {
    $myArray[] = explode(",", $key);
}