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
}

我不知道如何尝试,因为每次迭代都会获得当前行的信息。

我们可以在 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循环中,您可以添加或减去 from$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 回答
0
$rows = array();
$index = 0;

while(($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
    $rows[] = $data;
    if($index >= 5) {
        $currIndex = $index - 4;
        $previousIndex = $currIndex - 1;
        $nextIndex = $currIndex + 3;

        if(isset($rows[$nextIndex]) && isset($rows[$previousIndex]))
        {
            $nextRow = $rows[$nextIndex];
            $prevRow = $rows[$previousIndex];
        }
    }
    $index++;
}
于 2012-11-21T10:57:23.977 回答