1

現在、php で fgetcsv を使用して CSV ファイルの行を取得しています。行ごとに、いくつかの要件のために、前の 3 行と次の 3 行が必要です。

while(($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
    //$data is current row data
    //I need previous rows and next rows data
}

while iterate のたびに現在の行の情報が取得されるため、これを試す方法がわかりません。

fgetcsv ループ内でこれを達成できるものはありますか? この問題の他の代替案も受け入れています。

4

3 に答える 3

2

データを配列に追加してから、forループを使用します。

$myData = array();

while(($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
    $myData[] = $data;
}

for($i=0; $i<count($myData); $i++)
{
    // $myData[$i] is the current row
}

ループでは、任意の行を取得するためにfor加算または減算できます。$iしたがって、次の行については、$myData[$i+1]、またはその次の$myData[$i+2].

同じことが前の行にも当てはまります: $myData[$i-1]. 行にアクセスする前に、その行が存在することを確認してください。たとえば、最初の行には前の行がありません。

于 2012-11-21T10:47:38.110 に答える
2

これらの行を自分で保存する必要があります。

私はこのようなことをします:

$rows = array();

$index = 0;

while(($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
    $rows[] = $data;

    if($index >= 6) {
        $currentIndex = $index - 4;
        $currentRow = $rows[$currentIndex];
        //Do something with $rows[$currentRowIndex +- 3];    
    }
    $index++;
}

データが大きすぎてすべてを配列に格納できない場合は、最大 7 行のみを格納し、行 4 で操作することもできます。

$rows = array();

while(($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
    $rows[] = $data;
    if(count($rows) == 7) {
        $currentRow = $rows[4];
        //Do something with $rows[0-6];
        array_shift($rows);    
    }
}
于 2012-11-21T10:48:06.343 に答える