2015-06-02 6 views
5

Ich möchte zwei Arrays mit Schlüsseln in PHP zusammenführen. Wenn kein Schlüssel für ein Array definiert ist, sollte er den Wert mit Null füllen. Ich wollte Lösung wieVerschmelzen zwei Arrays unterschiedlicher Länge mit Schlüssel und 0 füllen auf leer

array_merge_recursive($a1, $a2) 

Aber es produziert nicht die erforderliche Ausgabe. Ich habe folgendes codiert. Es funktioniert, aber ich möchte wissen, ob es andere gute und effiziente Lösungen wie array_merge_recursive() gibt;

function array_combine_zero_fill($a1,$a2){ 
    $a3=array(); 
    foreach($a1 as $k=>$v){ 
     $a3[$k]['doc1']=$v; 
     $a3[$k]['doc2']=array_key_exists($k, $a2) ? $a2[$k]:0; 
    } 
    foreach($a2 as $k=>$v){ 
     $a3[$k]['doc1']=array_key_exists($k, $a2) ? $a3[$k]['doc1']:0; 
     $a3[$k]['doc2']=$v; 
    } 
    return $a3; 
} 

Die Array-Struktur wie ist

folgende
$a1 = array(
    "apple"=>4, 
    "banana"=>2, 
    "mango"=>10, 
    "guava"=>1, 
    "cherry"=>3, 
    "grapes"=>7 
    ); 
$a2 = array(
    "pista"=>77, 
    "cashew"=>65, 
    "almond"=>23, 
    "guava"=>34, 
    "cherry"=>54, 
    "grapes"=>48 
    ); 

Das gewünschte Ergebnis wie dieses

aussehen sollte, ist
a3 = Array(
    [apple] => Array([doc1] => 4, [doc2] => 0),  
    [banana] => Array([doc1] => 2, [doc2] => 0), 
    [mango] => Array([doc1] => 10, [doc2] => 0), 
    [guava] => Array([doc1] => 1, [doc2] => 34), 
    [cherry] => Array([doc1] => 3, [doc2] => 54), 
    [grapes] => Array([doc1] => 7, [doc2] => 48), 
    [pista] => Array([doc1] => 0, [doc2] => 77), 
    [cashew] => Array([doc1] => 0, [doc2] => 65), 
    [almond] => Array([doc1] => 0, [doc2] => 23) 
); 
+2

Post die Array-Struktur zusammen mit dem erwarteten Ausgang –

+0

ich die Frage mit der Array-Struktur und Ausgabestruktur aktualisiert haben. – Prabhu

+2

@Prabhu warum schwirren Sie sogar Array 1, wenn alles, was Sie tun, einen Schlüssel, der in beiden für Array 1 ist, auf 0 setzt. Nehmen Sie zum Beispiel Trauben in der ersten Schleife die Werte auf 7 und 48, aber in Schleife zwei Sie überschreiben sie auf 0 und 48 ... Das ist sinnlos. – Styphon

Antwort

5
// Find all unique keys 
$keys = array_flip(array_merge(array_keys($a1), array_keys($a2))); 

// create new array 
foreach($keys as $k=>$v) { 
    $result[$k]['doc1'] = isset($a1[$k]) ? $a1[$k] : 0; 
    $result[$k]['doc2'] = isset($a2[$k]) ? $a2[$k] : 0; 
    } 

    var_dump($result); 
+1

Schön gemacht, sehr elegant. – Styphon

+0

@Styphon Selbst eine Katze mag ein freundliches Wort :) – splash58

3

Ihr Code nicht ganz vollständig. Versuchen Sie folgendes:

function array_combine_zero_fill($a1, $a2) { 
    $a3=array(); 
    foreach($a1 as $k=>$v){ 
     $a3[$k]['doc1']=$v; 
     $a3[$k]['doc2']=array_key_exists($k, $a2) ? $a2[$k]:0; 
    } 
    foreach($a2 as $k=>$v){ 
     // Only add to the array if it's not there, otherwise you just overwrite what was added in the first foreach above. 
     if (! isset($a3[$k])) { 
      $a3[$k]['doc1']=0; 
      $a3[$k]['doc2']=$v; 
     } 
    } 
    return $a3; 
} 
2
foreach(array_unique(array_keys(array_merge($a1,$a2))) as $k) 
{ 
    $output[$k]= array("doc1" => array_key_exists($k, $a1) ? $a1[$k] : 0, "doc2" => array_key_exists($k, $a2) ? $a2[$k] : 0); 
} 

print_r($output); 
Verwandte Themen