Zwei Arrays an übereinstimmendem Value kombinieren

suntrop

Erfahrenes Mitglied
Hallo.
Ich habe zwei Arrays die ich kombinieren möchte, nur noch nicht weiß wie.

PHP:
Array
(
    [0] => Array
        (
            [Auftragsnummer] => 450300
            [Produktnummer] => 153
            [Nachname] => Müller
        )

    [1] => Array
        (
            [Auftragsnummer] => 450301
            [Produktnummer] => 39
            [Nachname] => Mustermann
        )
        ...

Und Array 2:
PHP:
Array
(
    [0] => Array
        (
            [Auftragsnummer] => 450300
            [Zeitpunkt] => 10.10.2009
            [Bezahlt] => ja
        )

    [1] => Array
        (
            [Auftragsnummer] => 450301
            [Zeitpunkt] => 04.08.2010
            [Bezahlt] => ja
        )
        ...

Ich will die zwei Arrays genau dort zusammenführen, wo die Auftragsnummern gleich sind, damit ich später etwas in folgender Art habe:
PHP:
Array
(
    [0] => Array
        (
            [Auftragsnummer] => 450300
            [Produktnummer] => 153
            [Nachname] => Müller
            [Zeitpunkt] => 10.10.2009
            [Bezahlt] => ja
        )

    [1] => Array
        (
            [Auftragsnummer] => 450301
            [Produktnummer] => 39
            [Nachname] => Mustermann
            [Zeitpunkt] => 04.08.2010
            [Bezahlt] => ja
        )
        ...

In SQL würde ich es über ein JOIN erledigen bzw. in der WHERE-Klausel definieren. Für Arrays gibt es so etwas ja nicht.
Die üblichen Verdächtigen in der PHP-Doku scheinen mir wenig Mittel an die Hand zu geben. Combine geht nicht, da die Array-Felder in unterschiedlichen Sortierungen vorliegen. Habe auch schon versucht über Array_Search den Key für die Auftragsnummer zu suchen und dann mit dem Key genau den Wert in das andere Array einzuspeisen. Aber da blieb meine Ausgabe immer weiß - kam nichts :(

Ich weiß im Moment nicht so recht weiter. Gibt es dafür eine verhältnismäßig einfach Lösung? Oder muss ich da mit der großen Stricknadel ansetzen?

Bin dankbar für jede Hilfe und Tipp!

Grüße
suntrop

P.S.
Aller letztes Ziel ist übrigens eine Tabelle in der die Daten schön abzulesen sein sollen. Falls das wichtig ist.
 
Woher erhälst du denn die Arrays? Wenn du das Array als Instanz einer Klasse betrachten würdest, könntest du die Indizes als Eigenschaften auffassen. Daher würde ich schon bei der Erzeugung der Arrays ansetzen und eher eine Klasse verwenden.
 
… ich wusste doch, dass ich etwas wichtiges vergessen habe zu schreiben :)

Die Arrays erhalte ich als Rückgabe einer DB-Abfrage über eine API. Leider kann ich daran nichts ändern – weder an der Form der Übergabe noch am Inhalt. Ich bekomme nur vollgeladene Arrays, die ich soweit schon zurecht gestutzt habe.
 
In etwa so kann man es machen
PHP:
<?php
//Testdaten
$array1 = Array(
            0 => Array(
                    'Auftragsnummer' => 450300,
                    'Produktnummer' => 153,
                    'Nachname' => 'Müller'),
            1 => Array(
                    'Auftragsnummer' => 450301,
                    'Produktnummer' => 39,
                    'Nachname' => 'Mustermann'));
$array2 = Array(
            0 => Array(
                    'Auftragsnummer' => 450300,
                    'Zeitpunkt' => '10.10.2009',
                    'Bezahlt' => 'ja'),
            1 => Array(
                    'Auftragsnummer' => 450301,
                    'Zeitpunkt' => '04.08.2010',
                    'Bezahlt' => 'ja'));

            
            
//Arrays erstellen mit den Auftragsnummern als Indexe 
//DIes ist in der Annahme, dass nicht umbedingt beide Arrays immer die übereinstimmenden Indexe besitzen           
foreach($array1 as $auftrag){
    $a1[$auftrag['Auftragsnummer']] = $auftrag;
}            
foreach($array2 as $auftrag){
    $a2[$auftrag['Auftragsnummer']] = $auftrag;
}            

//Beide Arrays zusammenfügen
foreach($a1 as $nr => $auftrag){
    $result[$nr] = array_merge($a2[$nr], $auftrag);
}

var_dump($result);
?>

Nachtrag:
Wenn du lieber mit Array-Funktionen arbeitest
PHP:
function getKey($item){
    return $item['Auftragsnummer'];
} 
//Arrays erstellen mit den Auftragsnummern als Keys
$a1 = array_combine(array_map('getKey', $array1), $array1);
$a2 = array_combine(array_map('getKey', $array2), $array2);
//Schnittmenge der keys bestimmen
$keys = array_keys(array_intersect_key($a1, $a2));

foreach($keys as $key){
    $result[$key] = array_merge($a2[$key], $a1[$key]);
}
 
Zuletzt bearbeitet:
Hallo yaslaw.

Danke für deine Hilfe – war die letzten Tag unterwegs und konnte erst jetzt schreiben.
Dein zweites Beispiel sieht interessant aus. Ich werde es gleich morgen mal ausprobieren.

Grüße und schönen Dank für deine Mühe
suntrop
 
Zurück