2013-08-14 9 views
8

Ich versuche, die Elemente eines Arrays mit Werten aus einem anderen zu überschreiben - ohne erstellen zusätzliche Elemente in dem Prozess.PHP array_replace ohne Schlüssel zu erstellen

Zum Beispiel:

$base = array('a' => 'apple', 'b' => 'banana'); 
$replace = array('a' => 'orange', 'b' => 'grape', 'c' => 'cauliflower'); 

die Arrays Merge zu erstellen:

array('a' => 'orange', 'b' => 'grape'); // 'c' not included 

Verwendung array_merge oder array_replace würden die Elemente richtig zu überschreiben, sondern die sich ergebende Anordnung würde Elemente umfassen nicht gefunden in der ersten Reihe.

Wie kann ich zwei Arrays kombinieren, um ein Array zu erstellen, das nur die Schlüssel aus dem ersten Array und die entsprechenden Werte aus einem zweiten Array enthält?

Gibt es eine vorhandene PHP-Array-Funktion, die dies tun kann?

Danke für Ihre Hilfe!

Antwort

12

Sie array_intersect_key und array_merge es tun können (Sicherstellen, dass neue Elemente nicht im Ergebnis erscheinen) und array_merge ersetzt die Werte in $base mit diesen neuen Werten von $replace (während sichergestellt wird, dass Schlüssel, die nur in $base erscheinen, ihre ursprünglichen Werte behalten).

See it in action.

Es ist interessant, dass das gleiche Ergebnis auch mit der Reihenfolge der Anrufe umgekehrt erreicht werden kann, Folgendes zu beachten:

$result = array_intersect_key(array_merge($base, $replace), $base); 

jedoch diese Version tut etwas mehr Arbeit, so empfehle ich den Erste.

+0

warum nicht nur array_intersect_key ($ ersetzen, $ Base)? während der Überprüfung der Dokumentation [link] http://www.php.net/manual/en/function.array-intersect-key.php "Beachten Sie auch, dass die Werte für die Schlüssel 'blau' und 'grün' zwischen den beiden unterscheiden Eine Übereinstimmung tritt immer noch auf, da nur die Schlüssel überprüft werden. Die zurückgegebenen Werte sind die Werte von array1. " Also ich denke Array_merge ist nicht erforderlich. – coderkane

+0

@coderkane: Denn wenn '$ ersetzen 'nicht alle Schlüssel enthält, die $ Base hat das Ergebnis fehlende Werte. – Jon

+0

Ich bin mir bewusst, aber das OP hat gesagt, er will Werte nur aus dem zweiten Array.Es ist jedoch möglich, dass er dieses Szenario nicht vorausgesehen hat, so gut, darauf hinweisen. – coderkane

0

Ich kann nicht an eine eingebaute Methode dafür denken, aber es wäre trivial mit einer Schleife und array_key_exists.

foreach($replace as $k => $v) 
{ 
    if (array_key_exists($k, $base)) 
     $base[ $k ] = $v; 
} 
0

Folgendes sollte es tun:

$result = array_merge($base, array_intersect_key($replace, $base)); 

array_intersect_key isoliert die Elemente von $replace mit Schlüsseln, die in $base existieren bereits:

foreach ($replace as $k => $v) 
    if (isset($base[$k])) $base[$k]=$v; 
3
print_r(array_intersect_key($replace, $base)); 
+0

Das sieht korrekt aus und ungefähr so ​​effizient wie sie kommen. – Floris

+0

Danke allen! Ich wusste, dass es eine einfache Lösung geben musste. – Jason

+2

@Jason: Bitte beachten Sie, dass wenn "$ replace" keine Werte für alle Schlüssel in "$ base" hat, die "fehlenden" Schlüssel überhaupt nicht im Ergebnis erscheinen. – Jon

0

Versuchen Sie folgendes:

$result = array_replace($base, array_intersect_key($replace, $base)); 
Verwandte Themen