在 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);
}
}
}?>