PHP 8.1.0 RC 2 available for testing

SplFileObject::seek

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::seekSe déplace sur une ligne spécifique

Description

public SplFileObject::seek(int $line): void

Se déplace sur une ligne spécifique du fichier.

Liste de paramètres

line

Le numéro de la ligne (en commençant par 0) sur laquelle on se déplace.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Lance une exception LogicException si line est négatif.

Exemples

Exemple #1 Exemple avec SplFileObject::seek()

Cet exemple affiche la 3ème ligne du script, qui sera trouvée à la position n°2.

<?php
$file 
= new SplFileObject(__FILE__);
$file->seek(2);
echo 
$file->current();
?>

Résultat de l'exemple ci-dessus est similaire à :

$file->seek(2);

Voir aussi

add a note add a note

User Contributed Notes 2 notes

up
4
ahmad_maqsood at waku-2 dot com
3 years ago
A sleek way of counting the number of lines in a file can be like below

$file = new \SplFileObject('file.extension', 'r');
$file->seek(PHP_INT_MAX);

echo $file->key() + 1;
up
1
info at inatica dot com
24 days ago
there is a bug using fseek on previos versions of PHP8.0.1
See:

https://bugs.php.net/bug.php?id=46569

https://3v4l.org/O89dJ

I solved it with a function:

<?php
/**
* SEEK an Spl object
* There is a bug in php for seeking files
* seems solved php_version > PHP8.0.1
* See https://bugs.php.net/bug.php?id=46569
* & https://3v4l.org/O89dJ
*
* $Spl->seek() Works ok in all versions with offset 0 (first row)
* On PHP_VERSION < 8.0.1:
*  - Offset 1: seek() cannot seek at row 1. It will be done manually, rewind file and reading first row
*  - Rest of Offsets: The cursor remains at next row of $Offset
*
* @param SplObject $Spl
* @param int $Offset
*/

function seek_spl($Spl, $Offset){
    if (
version_compare(PHP_VERSION, '8.0.1', '>=') || $Offset == 0) {
       
$Spl->seek($Offset);
    } else {
        if(
$Offset == 1 ){
           
$Spl->rewind(); // Ensure to go at first row before exit
           
$Spl->fgets(); // Read line 0. Cursor remains now at line 1
       
} else {
           
$Spl->seek($Offset-1);
        }
    }
}
?>
To Top