Jason
Jason

Reputation: 339

PHP array_replace without creating keys

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

Answers (5)

tim
tim

Reputation: 2722

Try this:

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

Upvotes: 0

Jon
Jon

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).

See it in action.

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

coderkane
coderkane

Reputation: 498

print_r(array_intersect_key($replace, $base));

Upvotes: 2

Neil Hampton
Neil Hampton

Reputation: 1883

the following should do it:

foreach ($replace as $k => $v)
   if (isset($base[$k])) $base[$k]=$v;

Upvotes: 0

kmfk
kmfk

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

Related Questions