Hallo Pit,
ich habe mal experimentiert - wenn Du die Daten bereits als Array vorliegen hast, ist es am einfachsten, wenn Du sie in eine hierarchische Darstellung überführst.
Damit meine ich ein Array, in dem die Werte von feld2 der Key sind. Jeder Eintrag davon ist ein Array, in dem die Werte von feld3 der Key sind. Und davon ist jeder Eintrag ein Array mit den Zeilen, die diese Wertekombination für feld2 und feld3 haben.
Diese Arrayhierarchie durchläufst Du dann mit foreach und kannst auf jedes Zeilen-Array einen array_unique anwenden. Ist der count für dieses Array dann 1, schreibst Du dafür den CSV Satz. Oder machst sofort den Insert in die real_table und sparst Dir das CSV Geraffel.
Mal angenommen, alle Sätze stehen in einem Array $data.
$data = ARRAY(
[ "feld1" => 1, "feld2" => 7, "feld3" => 8, "feld4" => "Mumpf" ],
[ "feld1" => 17, "feld2" => 4, "feld3" => 9, "feld4" => "Foo" ],
[ "feld1" => 17, "feld2" => 4, "feld3" => 9, "feld4" => "Foo" ],
[ "feld1" => 45, "feld2" => 5, "feld3" => 2, "feld4" => "Dings" ],
[ "feld1" => 46, "feld2" => 5, "feld3" => 2, "feld4" => "Pings" ],
);
Das überführst Du in die genannte Hierarchie. Statt foreach ($data as $row) kann es auch eine while-Schleife sein, die ein SQL Query-Result einliest.
$rowDict = [ ];
foreach ($data as $row) {
$f2 = $row["feld2"]; // Variablen für Lesbarkeit
$f3 = $row["feld3"];
if (empty($rowDict[$f2])) {
$rowDict[$f2] = [ $f3 => [ $row ] ];
}
else if (empty($rowDict[$f2][$f3])) {
$rowDict[$f2][$f3] = [ $row ];
}
else {
$rowDict[$f2][$f3][] = $row;
}
}
Die Schleife prüft Stufe für Stufe der Hierarchie, ob es für diese Stufe schon einen Eintrag gibt. Wenn nicht, wird der Eintrag auf dieser Stufe angelegt. Wenn doch, wird die Stufe entsprechend ergänzt.
Das kannst Du nun verarbeiten:
foreach ($rowDict as $f2Dict) {
foreach ($f2Dict as $rows) {
$uniqRows = array_unique($rows, SORT_REGULAR);
if (count($uniqRows) == 1)
importToDatabase($uniqRows[0]);
else
writeDuplicates($uniqRows);
}
}
importToDatabase
kann den CSV Satz schreiben, oder direkt den INSERT machen. Und writeDuplicates
kann eine CSV-Datei mit den Duplikaten schreiben, oder sie in eine Tabelle mit den Duplikaten INSERTen. Ganz wie Du willst.
Rolf
sumpsi - posui - clusi