Hallo Pit,
nein, nicht sehr viel. Die Array-Hierarchie sinkt um eine Stufe, d.h. die Abfragen beim Aufbau werden etwas einfacher, und beim Auslesen ist ein foreach weniger.
D.h. statt 23 Codezeilen sind's dann 18 oder so.
Das unsympathische an der SQL Lösung ist für mich, dass Du Daten erstmal rausschreibst, um sie extern zu überarbeiten. Dann importierst Du sie wieder. Es stellt sich nun heraus, dass die Überarbeitung eigentlich ganz einfach ist, man muss nur das Problem lösen, die Sätze mit gleichem Key zusammen zu bekommen.
Dafür gibt's auch andere Möglichkeiten wie eine Array-Hierarchie, aber die sind eher komplizierter.
Nur Mut! 😉
Das $rowDict Array würde für meine Beispieldaten von oben so aussehen (ich zeige für die Rows nur feld4, sonst wird's für das Forum zu breit). Für die Keys 4, 9 würde array_unique eine Identität erkennen und der Satz würde importiert werden.
$rowDict = ARRAY(
4 => ARRAY(
9 => ARRAY(
ARRAY(.... "feld4" => "Foo"),
ARRAY(.... "feld4" => "Foo")
)
),
5 => ARRAY(
2 => ARRAY(
ARRAY(.... "feld4" => "Dings"),
ARRAY(.... "feld4" => "Pings")
)
),
7 => ARRAY(
8 => ARRAY(
ARRAY(.... "feld4" => "Mumpf"),
)
)
);
Lässt Du feld2 oder feld3 weg, hat diese Hierarchie eine Stufe weniger.
Sind feld2 und feld3 beides Strings, könntest Du auch einen kombinierten Schlüssel machen, sowas wie $feld2."~".$feld3, und den als Key für das Dictionary nutzen. Dann hast Du eine Hierarchiestufe weniger, aber kannst trotzdem beide Schlüssel verwenden. Der Aufbau des Dictionary sieht dann so aus (da Du ein Freund von ARRAY() statt [] zu sein scheinst, habe ich das mal verwendet):
$rowDict = ARRAY();
foreach ($data as $row) {
$key = $row["feld2"] . "~" . $row["feld3"]; // Schlüssel der Row
// Noch kein Eintrag zum $key -> Neues Subarray anlegen
// Andernfalls an's vorhandene Subarray anhängen.
if (empty($rowDict[$key])) {
$rowDict[$key] = ARRAY( $key => $row);
}
else {
$rowDict[$key][] = $row;
}
}
Bei der Auswertung entfällt dann eine der geschachtelten foreach-Schleifen.
Rolf
sumpsi - posui - clusi