Php 如何将CSV倒带一行?
我通过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链
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_集)}中断;