如何将CSV重绕一行?

时间:2015-06-30 09:51:19

标签: php csv

我正在循环使用CSV来获取产品数据。有些行是产品的变体,并且有自己的行,例如:

sku, base_sku, name, desc, attribute
, 123, "product name", "long description here", Colour
abc,123,,,Red
xyz,123,,,Blue
novar,novar,"No variant product", "description here",

主要产品有base_sku。所有变体都将具有特定的sku,并通过base_sku链接到产品。如果产品没有变体,那么产品的sku和base_sku具有相同的值。

无论如何,我正在使用以下方式循环CSV:

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

然后我正在检查变体并在循环中执行另一个变换以获取所有变体:

while (($varient = fgetcsv($handle, 1000, ",")) !== FALSE){

在此while循环期间,我正在检查skubase_sku是否相同,以及它们是否突破while循环。现在我想将文件指针倒回一行,这样当第一个while循环时它将读取正确的行。

目前我尝试过:

fseek($handle,-1,SEEK_CUR);

我当时误解的是,每个字符都返回文件指针,而不是每行。

如何让文件指针返回一行​​?

2 个答案:

答案 0 :(得分:0)

似乎没有办法做到这一点,所以我已经转换了一些代码来处理数组:

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

foreach ($rows as $data) {

然后我使用数组函数next()prev()

答案 1 :(得分:0)

你可以使用函数ftell()保存以前的位置 http://php.net/manual/en/function.ftell.php 然后你可以回到那个位置 使用函数fseek()

所以你的代码看起来像这样

$prev_line=null;

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  $prev_line=ftell($handle);
  while (($varient = fgetcsv($handle, 1000, ",")) !== FALSE){
    if($varient['sku']==$varient['base_sku']){
        fseek($handle, $prev_line, SEEK_SET);
        break;
    }
  }
}

所以你的指针将在它进入第二个while循环

之前的位置