2013-07-04 5 views
41

Ich habe zwei Arrays:Wie Array zusammenführen und Keys erhalten?

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 

ich sie zusammenführen möchten und die Schlüssel zu halten und die Reihenfolge und nicht neu indizieren !!

Wie komme ich so?

Array 
(
    [a] => new value 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [123] => 456 
) 

Ich versuche zu array_merge(), aber es wird nicht die Schlüssel aufbewahrt werden:

print_r(array_merge($array1, $array2)); 

Array 
(
    [a] => 'new value' 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [0] => 456 
) 

ich an die Gewerkschaft Betreiber versuchen, aber es wird nicht das Element zu überschreiben:

print_r($array1 + $array2); 

Array 
(
    [a] => 1 <-- not overwriting 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [123] => 456 
) 

Ich versuche, Ort zu tauschen, aber die Bestellung ist falsch, nicht meine Notwendigkeit:

print_r($array2 + $array1); 

Array 
(
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [a] => new value 
    [123] => 456 
    [b] => 2 
    [c] => 3 
) 

Ich möchte keine Schleife verwenden, gibt es eine Möglichkeit für hohe Leistung?

+0

Dont Sie spiegeln nur die Reihenfolge der Array merge ? array_merge ($ array2, $ array1); –

+2

Das Problem mit array_merge() ist, dass es den Schlüssel "123" sieht und interpretiert es als numerisch, die neu indiziert wird. – jcsanyi

Antwort

106

Sie suchen array_replace():

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 
print_r(array_replace($array1, $array2)); 

Verfügbar seit PHP 5.3.

aktualisieren

Sie auch die Vereinigung können array operator; es funktioniert für ältere Versionen und tatsächlich schneller sein könnte:

print_r($array2 + $array1); 
+1

@joe Gern geschehen.Natürlich gibt es immer noch eine Schleife, der Unterschied ist, wo es stattfindet :) –

+0

Meine Lösung würde als ein 5.3 Affen Patch für diese Funktion fungieren – Orangepill

-1

Ich denke, das helfen könnte, wenn ich richtig verstehen:

foreach ($i = 0, $num = count($array2); $i < $num; $i++) 
{ 
    $array = array_merge($array1, $arrar2[$i]); 
} 
3

@Jack die native Funktion aufgedeckt, die dies tun würde, aber da es in PHP 5.3 und darüber nur verfügbar ist, sollte dies zu emulieren arbeitet Funktionalität auf Pre 5.3 installiert

if(!function_exists("array_replace")){ 
     function array_replace(){ 
     $args = func_get_args(); 
     $ret = array_shift($args); 
     foreach($args as $arg){ 
      foreach($arg as $k=>$v){ 
       $ret[(string)$k] = $v; 
      } 
     } 
     return $ret; 
    } 
} 
+0

Ich möchte keine Schleife verwenden, gibt es eine Möglichkeit für hohe Leistung? – Jasper

+0

Ich kann mir keinen vorstellen, der die Anforderung von numerischen Schlüsseln erfüllt. Zählen Sie die Lösung nicht aus, ich glaube nicht, dass die Schleife zu der Leistung führen wird, die Sie sich vorstellen. – Orangepill

+0

Okay, aber vielen Dank. – Jasper

2

array_replace_recursive() oder array_replace() ist die Funktion, die Sie suchen,

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 


var_dump(array_replace_recursive($array1, $array2)); 

Demo

Verwandte Themen