<?php
function fputcsv_content($fp, $array, $delimiter=",", $eol="\n")
{
static $find = ["\\r","\\n"];
static $replace = ["\r","\n"];
static $cycles_count = 0;
$cycles_count++;
$array = array_map(function($value) use($delimiter) { return clean_value($value, $delimiter);
}, $array);
$line = implode($delimiter, $array) . $eol;
$return_value = $line;//fputs($fp, $line);
/** purposefully free up the ram **/
$line = null;
$eol = null;
$array = null;
/** trigger gc_collect_cycles() every 250th call of this method **/
if($cycles_count % 250 === 0) gc_collect_cycles();
return $return_value;
}
/** Use a second function so the GC can be triggered here
* when it returns the value and all intermediate values are free.
*/
function clean_value($value, $delimeter)
{
/**
* use static values to prevent reassigning the same
* values to the stack over and over
*/
static $regex = [];
static $find = "\r\n";
static $replace = "\n";
static $quote = '"';
if(!isset($regex[$delimeter])) { $regex[$delimeter] = "/[$delimiter\"\n\r]/";
}
$value = $quote.str_replace($quote, '""', $value).$quote; }
return $value;
}
echo fputcsv_content(null, ['foo', "bar\n\rbaz", "hello world!",'test " test']);
PD9waHAKZnVuY3Rpb24gZnB1dGNzdl9jb250ZW50KCRmcCwgJGFycmF5LCAkZGVsaW1pdGVyPSIsIiwgJGVvbD0iXG4iKSAKewogICAgc3RhdGljICRmaW5kID0gWyJcXHIiLCJcXG4iXTsKICAgIHN0YXRpYyAkcmVwbGFjZSA9IFsiXHIiLCJcbiJdOwogICAgc3RhdGljICRjeWNsZXNfY291bnQgPSAwOwogICAgJGN5Y2xlc19jb3VudCsrOwogICAgCiAgICAkYXJyYXkgPSBhcnJheV9tYXAoZnVuY3Rpb24oJHZhbHVlKSB1c2UoJGRlbGltaXRlcikgewogICAgICByZXR1cm4gY2xlYW5fdmFsdWUoJHZhbHVlLCAkZGVsaW1pdGVyKTsKICAgIH0sICRhcnJheSk7CiAgICAkZW9sID0gc3RyX3JlcGxhY2UoJGZpbmQsICRyZXBsYWNlLCAkZW9sKTsKCiAgICAkbGluZSA9IGltcGxvZGUoJGRlbGltaXRlciwgJGFycmF5KSAuICRlb2w7CiAgICAKICAgICRyZXR1cm5fdmFsdWUgPSAkbGluZTsvL2ZwdXRzKCRmcCwgJGxpbmUpOwoKICAgIC8qKiBwdXJwb3NlZnVsbHkgZnJlZSB1cCB0aGUgcmFtICoqLwogICAgJGxpbmUgPSBudWxsOwogICAgJGVvbCA9IG51bGw7CiAgICAkYXJyYXkgPSBudWxsOwoKICAgIC8qKiB0cmlnZ2VyIGdjX2NvbGxlY3RfY3ljbGVzKCkgZXZlcnkgMjUwdGggY2FsbCBvZiB0aGlzIG1ldGhvZCAqKi8KICAgIGlmKCRjeWNsZXNfY291bnQgJSAyNTAgPT09IDApIGdjX2NvbGxlY3RfY3ljbGVzKCk7CgogICAgcmV0dXJuICRyZXR1cm5fdmFsdWU7Cn0KCi8qKiBVc2UgYSBzZWNvbmQgZnVuY3Rpb24gc28gdGhlIEdDIGNhbiBiZSB0cmlnZ2VyZWQgaGVyZQogICogd2hlbiBpdCByZXR1cm5zIHRoZSB2YWx1ZSBhbmQgYWxsIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIGZyZWUuCiAgKi8KZnVuY3Rpb24gY2xlYW5fdmFsdWUoJHZhbHVlLCAkZGVsaW1ldGVyKSAKewogICAvKioKICAgICAqICB1c2Ugc3RhdGljIHZhbHVlcyB0byBwcmV2ZW50IHJlYXNzaWduaW5nIHRoZSBzYW1lCiAgICAgKiAgdmFsdWVzIHRvIHRoZSBzdGFjayBvdmVyIGFuZCBvdmVyCiAgICAgKi8KICAgc3RhdGljICRyZWdleCA9IFtdOyAKICAgc3RhdGljICRmaW5kID0gIlxyXG4iOwogICBzdGF0aWMgJHJlcGxhY2UgPSAiXG4iOwogICBzdGF0aWMgJHF1b3RlID0gJyInOwogICBpZighaXNzZXQoJHJlZ2V4WyRkZWxpbWV0ZXJdKSkgewogICAgICAkcmVnZXhbJGRlbGltZXRlcl0gPSAiL1skZGVsaW1pdGVyXCJcblxyXS8iOwogICB9CiAgICR2YWx1ZSA9IHRyaW0oJHZhbHVlKTsKICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoJGZpbmQsICRyZXBsYWNlLCAkdmFsdWUpOwogICBpZihwcmVnX21hdGNoKCRyZWdleFskZGVsaW1ldGVyXSwgJHZhbHVlKSkgewogICAgICAgICR2YWx1ZSA9ICRxdW90ZS5zdHJfcmVwbGFjZSgkcXVvdGUsICciIicsICR2YWx1ZSkuJHF1b3RlOwogICB9CiAgIHJldHVybiAkdmFsdWU7Cn0KCmVjaG8gZnB1dGNzdl9jb250ZW50KG51bGwsIFsnZm9vJywgImJhclxuXHJiYXoiLCAiaGVsbG8gd29ybGQhIiwndGVzdCAiIHRlc3QnXSk7