PHP Conference Japan 2024

SplFileObject::seek

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

SplFileObject::seek移動到指定行

說明

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

移動到檔案中的指定行。

參數

line

要移動到的以零為基底的行號。

回傳值

不回傳任何值。

錯誤/例外

如果 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
3 年前
在 PHP 8.0.1 之前的版本使用 fseek 時存在一個錯誤
參考

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

https://3v4l.org/O89dJ

我用一個函式解決了它

<?php
/**
* 對 Spl 物件執行 SEEK
* PHP 中存在一個關於檔案 seek 的錯誤
* 似乎在 php_version > PHP 8.0.1 時已解決
* 參考 https://bugs.php.net/bug.php?id=46569
* & https://3v4l.org/O89dJ
*
* $Spl->seek() 在所有版本中使用偏移量 0(第一列)時都能正常運作
* 在 PHP_VERSION < 8.0.1 時:
* - 偏移量 1:seek() 無法 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
7 年前
計算檔案行數的一個簡潔方法如下:

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

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