SplFileObject::seek

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

SplFileObject::seek跳转到指定行

说明

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

跳转到文件中的指定行。

参数

line

要跳转到的行号,从 0 开始。

返回值

没有返回值。

错误/异常

如果 line 为负数,则抛出 LogicException

示例

示例 #1 SplFileObject::seek() 示例

此示例输出脚本的第三行,该行位于位置 2。

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

上面的示例将输出类似于

$file->seek(2);

参见

添加备注

用户贡献的备注 2 备注

13
info at inatica dot com
2 年前
在 PHP8.0.1 的先前版本中使用 fseek 存在一个错误。
参见

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

https://3v4l.org/O89dJ

我用一个函数解决了它

<?php
/**
* 在 Spl 对象上执行 SEEK
* PHP 中存在一个用于搜索文件的错误
* 似乎已在 php_version > PHP8.0.1 中解决
* 参见 https://bugs.php.net/bug.php?id=46569
* & https://3v4l.org/O89dJ
*
* $Spl->seek() 在所有版本中都适用于偏移量 0(第一行)
* 在 PHP_VERSION < 8.0.1 上:
* - 偏移量 1:seek() 无法在第 1 行进行搜索。它将手动完成,倒回文件并读取第一行
* - 其余偏移量:光标将保留在 $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(); // 确保在退出之前转到第一行
$Spl->fgets(); // 读取第 0 行。光标现在保留在第 1 行
} else {
$Spl->seek($Offset-1);
}
}
}
?>
-1
ahmad_maqsood at waku-2 dot com
6 年前
一种计算文件行数的简洁方法如下所示

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

echo $file->key() + 1;
To Top