将2个csv文件与php进行比较,并返回更改后的行号


Compare 2 csv files with php and return changed row numbers

我有一个脚本,可以比较2个csv文件,并将更改后的行id放入数组:

 //Function for comparing two files
 function row_compare($a, $b)
 {
 if ($a === $b)
 {
 return 0;
 }
 return (implode("",$a) < implode("",$b) ) ? -1 : 1;
 }
 //Set previous csv file
 $file1 = new SplFileObject("file1.csv");
 $file1->setFlags(SplFileObject::READ_CSV);
 //Set new csv file
 $file2 = new SplFileObject("file2.csv");
 $file2->setFlags(SplFileObject::READ_CSV);
 foreach ($file1 as $row)
 {
 $csv_1[] = $row;
 }
 foreach ($file2 as $row)
 {
 $csv_2[] = $row;
 }
 //Check differences
 $all_unique_rows = array_udiff($csv_1, $csv_2, 'row_compare');
 //Get rows id which have difference
 foreach($all_unique_rows as $key=>$unique_row)
 {
 foreach($unique_row as $element)
 {
 $rowwwithdiffer[] = array($key);
 }
 }

它很好用!但我想要实现的是-不是得到1,2,3-使用1-3,而是-如果更改的行是连续的,则使用间隔而不是每个更改的行id…

我怎样才能做到这一点?;-)

TNX!

您必须使用id运行数组,并检查它们是否连续,并相应地进行处理。

$aglutinatedRows = [];
$lastRowId = $rowwwithdiffer[0];
$firstRowInSequence = $rowwwithdiffer[0];
foreach(array_slice($rowwwithdiffer, 1) as $row) {
    if ($row == $lastRowId + 1) {
        $lastRowId = $row;
    } else {
        $aglutinatedRows[] = $firstRowInSequence != $lastRowId ? $firstRowInSequence . ' - ' . $lastRowId : lastRowId;
        $firstRowInSequence = $row;
        $lastRowId = $row;
    }
}