Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将CSV倒带一行?_Php_Csv - Fatal编程技术网

Php 如何将CSV倒带一行?

Php 如何将CSV倒带一行?,php,csv,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", 主产品具有基本库存单位。所有变体都有一个特定的sku,通过基本sku链

我通过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",
主产品具有
基本库存单位
。所有变体都有一个特定的sku,通过
基本sku
链接到产品。如果产品没有变体,则该产品具有相同值的sku和基本sku

无论如何,我使用以下方法循环浏览CSV:

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
然后,我检查变量并执行另一个while循环以获取所有变量:

while (($varient = fgetcsv($handle, 1000, ",")) !== FALSE){
在此
while
循环期间,我检查
sku
基本sku
是否相同,以及它们是否脱离
while
循环。现在我想将文件指针倒回一行,这样当第一个
while
循环时,它将读取正确的一行

目前,我已尝试:

fseek($handle,-1,SEEK_CUR);
我当时误解了这一点,它是按字符而不是每行返回文件指针


如何使文件指针返回一行?

似乎没有办法做到这一点,因此我对代码进行了一些转换,以使用数组:

$rows=array();
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$rows[]=$data;
}
foreach($行作为$数据){

然后我使用数组函数,您可以使用函数ftell()保存上一个位置 然后你可以回到那个位置 使用函数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循环之前一样

您可以使用函数转换和检查文件指针函数csvToArray($file){$delimiter=',';$csv_file=new SplFileObject($file);$csv_file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_new_LINE)$csv_文件->设置csv控制($delimiter);/***处理csv文件中的每一行*/而($csv_文件->当前()!==false){$count++;$lines[]=trim($csv_文件->当前());$csv_文件->下一个();}foreach($line as$key=>$value){$lines[$key]=explode(“;”,$value)}return$lines;}没有简单的方法。将该行保存在变量中并从中检索。我尝试了该方法,但无效。结果仅是当前行的最后一个字符-fgetcsv返回包含最后一个字符的单元素数组:(能否尝试移动$prev_line=ftell($handle);在第一个循环结束时,在第二个循环内部检查(是否为空($prev_行)){倒带($handle)}否则{fseek($handle,$prev_行,SEEK_集)}中断;