85 lines
1.8 KiB
PHP
85 lines
1.8 KiB
PHP
<?php
|
||
|
||
namespace Goodby\CSV\Export\Standard;
|
||
|
||
use SplFileObject;
|
||
|
||
class CsvFileObject extends SplFileObject
|
||
{
|
||
const FILE_MODE_WRITE = 'w';
|
||
const FILE_MODE_APPEND = 'a';
|
||
|
||
/**
|
||
* newline character
|
||
* @var string
|
||
*/
|
||
private $newline = "\n";
|
||
|
||
/**
|
||
* CSV filter
|
||
* @var callable
|
||
*/
|
||
private $csvFilter;
|
||
|
||
/**
|
||
* @param string $newline
|
||
* @return void
|
||
*/
|
||
public function setNewline($newline)
|
||
{
|
||
$this->newline = $newline;
|
||
}
|
||
|
||
/**
|
||
* Set csv filter
|
||
* @param callable $filter
|
||
*/
|
||
public function setCsvFilter($filter)
|
||
{
|
||
$this->csvFilter = $filter;
|
||
}
|
||
|
||
/**
|
||
* Write a field array as a CSV line
|
||
* @param array $fields
|
||
* @param string $delimiter
|
||
* @param string $enclosure
|
||
* @return int|void
|
||
*/
|
||
public function fputcsv($fields, $delimiter = null, $enclosure = null)
|
||
{
|
||
// Temporary output a line to memory to get line as string
|
||
$fp = fopen('php://temp', 'w+');
|
||
$arguments = func_get_args();
|
||
array_unshift($arguments, $fp);
|
||
call_user_func_array('fputcsv', $arguments);
|
||
rewind($fp);
|
||
|
||
$line = '';
|
||
|
||
while ( feof($fp) === false ) {
|
||
$line .= fgets($fp);
|
||
}
|
||
|
||
fclose($fp);
|
||
|
||
/**
|
||
* Because the php_fputcsv() implementation in PHP´s source code
|
||
* has a hardcoded "\n", this method replaces the last LF code
|
||
* with what the client code wishes.
|
||
*/
|
||
$line = rtrim($line, "\n"). $this->newline;
|
||
|
||
// if the enclosure was '' | false
|
||
if (empty($enclosure)) {
|
||
$line = str_replace("\0", '', $line);
|
||
}
|
||
|
||
if ( is_callable($this->csvFilter) ) {
|
||
$line = call_user_func($this->csvFilter, $line);
|
||
}
|
||
|
||
return $this->fwrite($line);
|
||
}
|
||
}
|