2009-06-14 17 views
2

Ich habe zwei Arrays ...PHP - Fusion Arrays

$arr1 = array(
    'name', 
    'date' => array('default' => '2009-06-13', 'format' => 'short'), 
    'address', 
    'zipcode' => array('default' => 12345, 'hidden' => true) 
); 

$arr2 = array(
    'name', 
    'language', 
    'date' => array('format' => 'long', 'hidden' => true), 
    'zipcode' => array('hidden' => false) 
); 

Hier ist das gewünschte Ergebnis:

$final = array(
    'name', 
    'date' => array('default' => '2009-06-13', 'format' => 'long', 'hidden' => true), 
    'zipcode' => array('default' => 12345, 'hidden' => false) 
); 
  • nur die Elemente von $ arr2 (die auch in $ arr1 existieren) sind used
  • Die Attribute jedes Elements werden zusammengeführt
  • Wenn ein gemeinsames Element (z. B. Postleitzahl) ein Attribut teilt (z. B. ausgeblendet), dann t er Attribut von $ arr2 hat Vorrang

Was sind einige gute Ansätze zur Lösung dieses Problems?

Vielen Dank im Voraus.

EDIT: Ich habe versucht, etwas zusammen zu humpeln ... Kritik begrüßt:

$new_array = array_intersect_key($arr2, $arr1); 

foreach ($new_array as $key => $val) 
{ 
    if (is_array($arr1[$key])) 
    { 
     if (is_array($val)) 
     { 
      $new_array[$key] = array_merge($val, $arr1[$key]); 
     } 
     else 
     { 
      $new_array[$key] = $arr1[$key]; 
     } 
    } 
} 
+1

Gute Praxis array_intersect_key in diesem Fall Code wie das als Antwort auf Ihre eigene Frage zu stellen ist. – Eric

+0

Das Problem ist, dass die obige "Lösung" nicht funktioniert ... – Matt

+0

Ich habe mir das angeschaut, aber ich wundere mich über eine leichte Inkonsistenz. Sie interessieren sich nur für die erste Dimension des Arrays und dann alles in der zweiten Dimension zusammenführen, überschreiben? Wird sich das jemals über zwei Dimensionen hinaus erstrecken? –

Antwort

2

Sie waren in der Nähe

$newArr = array_intersect_key($arr1, $arr2); 
foreach ($newArr as $key => $val) 
{ 
    if (is_array($val)) 
    { 
     $newArr[$key] = array_merge($arr1[$key], $arr2[$key]); 
    } 
} 

bearbeiten hatte einfach die array_intersect ändern

+0

Das sieht auch nicht ganz richtig aus. Wenn $ arr1 ['address'] ein Array ist, dann macht es es immer noch zur endgültigen Ausgabe ...: \ – Matt

+0

Ich habe es nicht wirklich überprüft, es gab mir nur das richtige Ergebnis, also hörte ich auf: x. Lass mich nochmal schauen. –

0

finden Sie vielleicht array_intersect() nützlich

link text

+0

Ich nehme an, er weiß über die Funktion durch die Tatsache, dass eine Teilmenge von solchen in seinem Beispielcode enthalten ist. –