Reputation: 339
I am trying to overwrite the elements of one array with values from another – without creating additional elements in the process.
For example:
$base = array('a' => 'apple', 'b' => 'banana');
$replace = array('a' => 'orange', 'b' => 'grape', 'c' => 'cauliflower');
Merge the arrays to create:
array('a' => 'orange', 'b' => 'grape'); // 'c' not included
Using array_merge or array_replace would properly overwrite the elements, but the resulting array would include elements not found in the first array.
How can I combine two arrays to create an array containing only keys from the first array, and the corresponding values from a second array?
Is there an existing PHP array function that can do this?
Thanks for your help!
Upvotes: 18
Views: 5087
Reputation: 2722
Try this:
$result = array_replace($base, array_intersect_key($replace, $base));
Upvotes: 0
Reputation: 437386
You can use array_intersect_key
and array_merge
to do it:
$result = array_merge($base, array_intersect_key($replace, $base));
array_intersect_key
isolates those elements of $replace
with keys that already exist in $base
(ensuring that new elements will not appear in the result) and array_merge
replaces the values in $base
with these new values from $replace
(while ensuring that keys appearing only in $base
will retain their original values).
It is interesting to note that the same result can also be reached with the order of the calls reversed:
$result = array_intersect_key(array_merge($base, $replace), $base);
However this version does slightly more work, so I recommend the first one.
Upvotes: 23
Reputation: 1883
the following should do it:
foreach ($replace as $k => $v)
if (isset($base[$k])) $base[$k]=$v;
Upvotes: 0
Reputation: 3951
I can't think of a built in method for that, however, it would be trivial with a loop and array_key_exists
.
foreach( $replace as $k => $v )
{
if ( array_key_exists( $k, $base ) )
$base[ $k ] = $v;
}
Upvotes: 0