【问题标题】:PHP CSV, how to get previous and next 3 rows from current rowPHP CSV,如何从当前行获取前三行和后三行
【发布时间】:2012-11-21 10:40:06
【问题描述】:

我目前在 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 循环中实现的吗?我也愿意为这个问题提供其他替代方案。

【问题讨论】:

    标签: php csv


    【解决方案1】:

    您必须自己存储这些行。

    我会这样做:

    $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);    
        }
    }
    

    【讨论】:

    • 很好,我会试试的。顺便说一句,你忘了增加 $index
    【解决方案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]。请务必在尝试访问之前检查该行是否存在。例如,第一行不会有任何先前的行。

    【讨论】:

      【解决方案3】:
      $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++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 2019-01-30
        • 2017-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多