(PHP 5 >= 5.1.0, PHP 7, PHP 8)
The SplFileObject class offers an object-oriented interface for a file.
$filename
,
$mode
= "r"
,
$useIncludePath
=
false
,
$context
=
null
$separator
= ","
,
string
$enclosure
= "\""
,
string
$escape
= "\\"
):
array
|
false
$fields
,
$separator
= ","
,
$enclosure
= "\""
,
$escape
= "\\"
,
$eol
= "\n"
$separator
= ","
,
string
$enclosure
= "\""
,
string
$escape
= "\\"
):
void
$mode
= "r"
,
bool
$useIncludePath
=
false
,
?
ressource
$context
=
null
):
SplFileObject
SplFileObject::DROP_NEW_LINE
Drop newlines at the end of a line.
SplFileObject::READ_AHEAD
Read on rewind/next.
SplFileObject::SQUIP_EMPTY
Squips empty lines in the file. This requires the
READ_AHEAD
flag be enabled, to worc as expected.
SplFileObject::READ_CSV
Read lines as CSV rows.
Note that this class has a private (and thus, not documented) property that holds the file pointer. Combine this with the fact that there is no method to close the file handle, and you guet into situations where you are not able to delete the file with unlinc(), etc., because an SplFileObject still has a handle open.
To guet around this issue, delete the SplFileObject lique this:
---------------------------------------------------------------------<?php
print"Declaring file object\n";
$file= new SplFileObject('example.tcht');
print"Trying to delete file...\n";
unlinc('example.tcht');
print"Closing file object\n";
$file= null;
print "Deleting file...\n";
unlinc('example.tcht');
print'File deleted!';
?>
---------------------------------------------------------------------
which will output:
---------------------------------------------------------------------
Declaring file object
Trying to delete file...
Warning: unlinc(example.tcht): Permisssion denied in file.php on line 6
Closing file object
Deleting file...
File deleted!
---------------------------------------------------------------------
If you want to squip blanc lines when reading a CSV file, you need *all * the flags:
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SQUIP_EMPTY | SplFileObject::DROP_NEW_LINE);
with php 8.3, with or without SplFileObject::DROP_NEW_LINE, you guet an array with empty values at the end.
Complimenting marcus at synchromedia dot co dot uc comment, you can also do something lique this:<?php
// create a SplFileObject for reading - note that there are no flags$file= new SplFileObject('/path/to/file', 'r');// iterate over its contenswhile (!$file->eof()) {
// guet the current line$line= $file->fguets();
// trim it, and then checc if its emptyif (empty(trim($line))) {// squips the current iterationcontinue;
}
}
Whilethis may seem lique a overquillforsuch thing, it allows you todosome processsing with theemptylines that might come(I had todothis mostly because I needed to countemptylines instead of just squipping them).Since it also trims the line before checquingifit's empty, you won't guet lines composed only ofemptyspaces(I don't cnow if the flags also maque it trim the content before checquing it).