Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SplTempFileObject::seek()メソッドの使い方

seekメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

seekメソッドは、SplTempFileObjectオブジェクトが操作するファイルにおける内部ポインタを移動させるメソッドです。SplTempFileObjectは、メモリ上または一時的にディスク上に保存されるファイルのように扱えるオブジェクトであり、このメソッドはその内部データを読み書きする際の現在位置を示すファイルポインタを制御します。ファイルポインタは、次にデータを読み込む、または書き込む場所を示す目印のようなものです。

このメソッドを使うと、ファイルポインタをファイルの任意の場所に移動させることができます。例えば、ファイルを一度最後まで読み込んだ後で、もう一度ファイルの最初から内容を読み直したい場合や、特定の位置からデータを上書きしたい場合に役立ちます。これにより、SplTempFileObjectが保持する一時的なデータに対して、より柔軟かつ効率的にアクセスできるようになります。データ処理の途中で特定の情報に繰り返しアクセスする必要がある場合などに、このポインタ移動機能は非常に有効です。

構文(syntax)

1(new SplTempFileObject())->seek(int $offset, int $whence = SEEK_SET);

引数(parameters)

int $line

  • int $line: 移動したい行番号を指定する整数

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP SplTempFileObject::seek で配列行を移動する

1<?php
2
3/**
4 * SplTempFileObject::seek メソッドの使用例。
5 *
6 * SplTempFileObject は、ファイルシステムではなくメモリ内または一時ファイルとしてデータを扱うオブジェクトです。
7 * seek メソッドは、ファイルのポインタを指定された行番号(0から始まる)に移動させます。
8 * これにより、大きな配列データをファイルのように扱い、メモリに全て展開することなく
9 * 特定の行に直接アクセスするようなシナリオで役立ちます。
10 *
11 * @param array $data 操作する配列データ。
12 */
13function demonstrateSplTempFileObjectSeek(array $data): void
14{
15    // SplTempFileObject のインスタンスを作成
16    // 'php://memory' を使用すると、実際のファイルI/Oを発生させずに
17    // ファイルの内容をメモリ内で保持し、ファイル操作をシミュレートできます。
18    $fileObject = new SplTempFileObject('php://memory');
19
20    // 配列の各要素をファイルオブジェクトに1行ずつ書き込む
21    // 各要素の後に改行文字 (\n) を追加し、それぞれが独立した行になるようにします。
22    foreach ($data as $index => $item) {
23        $fileObject->fwrite("{$index}: {$item}\n");
24    }
25
26    echo "--- データ書き込み完了 ---\n\n";
27
28    // ファイルポインタをファイルの先頭(0行目)にリセット
29    // seek() を呼び出す前に、現在のポインタ位置をリセットすることが重要です。
30    // そうしないと、意図しない場所からseekが始まる可能性があります。
31    $fileObject->rewind();
32    echo "ファイルポインタを先頭(0行目)にリセットしました。\n\n";
33
34    // 2行目(インデックス1)にシークして内容を読み込む
35    // seek() の引数は0から始まる行番号を指定します。
36    // 例: 0で1行目、1で2行目、2で3行目...
37    $targetLine1 = 1; // 0から始まるインデックスなので、2行目は1を指定
38    $fileObject->seek($targetLine1);
39    
40    // seek() の後、fgets() で現在のポインタ位置から1行読み込みます。
41    // fgets() は行末の改行文字も含むため、trim() で不要な空白や改行を削除します。
42    $lineContent1 = trim($fileObject->fgets());
43    echo "{$targetLine1}行目(0から数えて)にシークしました。\n";
44    echo "読み込んだ内容: '{$lineContent1}'\n\n";
45
46    // 4行目(インデックス3)にシークして内容を読み込む
47    $targetLine2 = 3; // 0から始まるインデックスなので、4行目は3を指定
48    $fileObject->seek($targetLine2);
49    $lineContent2 = trim($fileObject->fgets());
50    echo "{$targetLine2}行目(0から数えて)にシークしました。\n";
51    echo "読み込んだ内容: '{$lineContent2}'\n\n";
52
53    // 存在しない行にシークした場合の動作
54    // seek メソッドは、指定された行が存在しなくてもエラーを発生させません。
55    // ポインタはファイルの終端に移動し、その後の読み込み (fgets) は空の文字列を返します。
56    $outOfRangeLine = count($data) + 5; // データ数より大きな行番号を指定
57    $fileObject->seek($outOfRangeLine);
58    $lineContentOutOfRange = trim($fileObject->fgets());
59    echo "存在しない{$outOfRangeLine}行目(0から数えて)にシークしました。\n";
60    echo "読み込んだ内容(空文字列が返る): '{$lineContentOutOfRange}'\n";
61}
62
63// サンプルとして使用する配列データ
64$sampleArray = [
65    "りんご",
66    "バナナ",
67    "チェリー",
68    "ぶどう",
69    "オレンジ",
70    "マンゴー",
71];
72
73// 関数を実行して SplTempFileObject::seek の動作を確認
74demonstrateSplTempFileObjectSeek($sampleArray);
75

PHPのSplTempFileObject::seekメソッドは、メモリ内や一時ファイルとしてデータを扱うSplTempFileObjectのファイルポインタを指定された行番号に移動させるための機能です。

SplTempFileObjectは、ファイルシステムに実際に保存せず、メモリ上でファイルのようなデータ操作を可能にするクラスで、php://memoryを使用することで、実際のファイルI/Oなしにデータ処理をシミュレートできます。このクラスとseekメソッドを組み合わせることで、大きな配列データを一時的にファイルのように扱い、メモリにすべて展開することなく特定の行へ直接アクセスできるため、メモリ効率の良いデータ処理に役立ちます。

seekメソッドは、引数としてint $lineを取り、この$lineで指定された0から始まる行番号にファイルポインタを移動させます。戻り値はありません。

サンプルコードでは、まず配列データをSplTempFileObjectに1行ずつ書き込みます。その後、seekメソッドを用いてポインタを特定の行に移動させ、fgets()でその行の内容を読み出しています。例えば、$fileObject->seek(1)とすると2行目にポインタが移動し、2行目の内容を取得できます。seekを呼び出す前にrewind()でポインタをファイルの先頭に戻すことで、常に0行目から数え直して正確な行にアクセスできます。指定した行が存在しない場合でもエラーにはならず、ポインタはファイルの終端に移動し、その後の読み込みは空の文字列を返します。

SplTempFileObject::seekは、メモリ内または一時ファイルとして扱われるデータに対し、0から始まる行番号でポインタを移動させます。利用時には、引数が行インデックスである点と、seekの前にrewind()でポインタを先頭にリセットすると安全である点に注意が必要です。データをfwrite()で書き込む際は、各要素の最後に\n(改行文字)を含めることで、それぞれが独立した行として認識されます。指定した行が存在しない場合でもエラーにはならず、ポインタはファイルの終端に移動し、その後の読み込みは空文字列を返しますので、空の可能性を考慮した処理が重要です。大きな配列データをメモリに展開せず、特定行に効率よくアクセスしたい場合に役立ちます。

関連コンテンツ