我有一个脚本,可以比较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;
}
}