<?php
function csv_reverse($handle, ...$csv_options) {
$offsets = [];
do {
$offsets[] = ftell($handle);
} while($row = fgetcsv($handle, ...$csv_options));
array_pop($offsets); // last offset is EOF
for( $i=count($offsets)-1; $i>=0; --$i ) {
fseek($handle, $offsets[$i]);
yield fgetcsv($handle, ...$csv_options);
}
}
$csv = <<<_E_
id,name,value
1,foo,"hello world"
2,bar,"hello
world"
3, baz,"""hello
world"""
_E_;
$in = fopen('php://memory', 'rwb');
fwrite($in, $csv);
rewind($in);
fgets($in);
foreach( csv_reverse($in, null, ',', '"', '\\') as $row ) {
var_dump($row);
}
preferences:
65.66 ms | 413 KiB | 5 Q