PHP Conference Japan 2024

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 条注释

info at inatica dot com
3年前
在PHP8.0.1之前的版本中使用fseek存在一个bug。
参见

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

https://3v4l.org/O89dJ

我用一个函数解决了这个问题

<?php
/**
* 搜索Spl对象
* PHP中存在一个用于搜索文件的bug
* 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);
}
}
}
?>
ahmad_maqsood at waku-2 dot com
7年前
一种简洁的计算文件行数的方法如下所示

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

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