質問: new SplFileObject('target_file_path.tsv'); $rows->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE); $rows->setCsvControl("\t"); foreach ($rows as $row){ //参照し配列を作成する処理1 } foreach ($rows as $row){ //参照し配列を作成する処理2 } ```
回答: ちょっと何を聞きたいのか今ひとつ分からないですが、 感じた内容で回答してみます。認識違うところあったら教えてください(そして質問本文に具体的に記載してください) > > 1.タブ区切りのファイルにREAD_CSVをつける理由がわかりません。 > > タブ区切りをカンマ区切りとして変換しながら読み込みsetCsvControlで再度タブ区切りに変換しているのでしょうか? > > > 区切り関係ないような。 * SplFileObject クラス::READ_CSV SplFileObject::READ_CSV CSV 列として行を読み込みます。 単に`$rows->setCsvControl("\t");`ここで「利用するCSVをタブ区切りで認識させる」設定してるだけですよね。 > > 2.SplFileObjectで取得したファイルの配列を取得する際1行ずつ読み込んでいると思うのですが、 > > 読み込んだSplFileObjectオブジェクトを2回以上for文で繰り返し回した時、ポインタが最後まで行かないのはなぜでしょうか? > > > ちょっと何を聞きたいのか分かりません。 > > for文で > > > と書いてますが、質問のコードはforeachですね。forだとオブジェクトは反復処理できないんじゃないかな・・・。書き間違いだとは思いますが、念のため。 ちなみに下記のようにして同じオブジェクトを2回回しましたが ``` $records1 = []; $records2 = []; foreach ($file as $line) { if(!is_null($line[0])){ $records1[] = $line; } } foreach ($file as $line) { if(!is_null($line[0])){ $records2[] = $line; } } echo count($records1); echo count($records2); ``` 同じ件数になりました。 (setFlags()にセットしたオプションも同じ。カンマ区切りのデータですが) どのようなデータを使ってどのような処理を書いて、どういう結果が出たのでしょうか。具体的に記載してください。