我目前在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循环中实现这一点吗?我也愿意为这个问题寻找其他替代方案。
答案 0 :(得分: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]
。在尝试访问之前,请务必检查该行是否存在。例如,第一行不会有任何前一行。
答案 1 :(得分: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);
}
}
答案 2 :(得分: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++;
}