-
- /**行戻り文字列からファイルの内容を返します
- */
- function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
- $content = array() ;
- $count = $endLine - $startLine;
- // PHP のバージョンを決定します (SplFileObject を使用するため、PHP>=5.1.0)
- if(version_compare(PHP_VERSION, '5.1.0', '>=') ){
- $fp = new SplFileObject($filename, $method);
- $fp->seek($startLine-1);//N 行目に進み、seek メソッドのパラメータは 0 から数え始めます
- for($i = 0; $i $content[]=$fp->current();// current() は現在の行の内容を取得します
- $fp->next( ) ;//次の行
- }
- }else{//PHP $fp = fopen($filename, $method);
- if(!$fp) return 'エラー: ファイルを読み取れません';
- for ( $ i=1;$i<$startLine;++$i) {// 前の $startLine 行をスキップします
- fgets($fp);
- }
- for($i;$i<=$endLine;++$ i ){
- $content[]=fgets($fp);// ファイル行の内容を読み取ります
- }
- fclose($fp);
- }
- return array_filter($content) // array_filter フィルター: false,null,' '
- }
-
- コードをコピー
手順:
上記には、!$fp->eof() または !feof($fp) の「最後まで読むかどうかの判断」は含まれていません。また、この判断は、多くの実行時間をテストすることでわかります。非常に多くの行があり、ここに追加する必要はまったくありません。
上記の関数から、特にファイル行数が非常に多く、次のコンテンツをフェッチする必要がある場合、SplFileObject を使用する方が以下の fgets よりもはるかに高速であることがわかります。
fgets には 2 つのループが必要で、$endLine 回ループする必要があります。
この方法には多大な労力がかかり、最も効率的な方法を見つけるために多くの中国語の書き方をテストしました。改善すべき点があると思われる方がいらっしゃいましたら、ぜひお知らせください。
使用して、行 35270 ~ 35280 の内容を返します。
コード:
echo ' ';<ol>var_dump(getFileLines('test.php',35270,35280));<li>echo ' ';
コピーコード
|