PHP array_replace без создания ключей

Я пытаюсь переписать элементы одного массива значениями из другого – без создания дополнительных элементов в процессе.

Например:

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

Объедините массивы для создания:

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

Использование array_merge или array_replace будет правильно перезаписывать элементы, но результирующий массив будет включать элементы, не найденные в первом массиве.

Как объединить два массива для создания массива, содержащего только ключи из первого массива, и соответствующие значения из второго массива?

Есть ли существующая функция массива PHP, которая может это сделать?

Спасибо за вашу помощь!

Для этого вы можете использовать array_intersect_key и array_merge :

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

array_intersect_key выделяет те элементы $replace ключами, которые уже существуют в $base (гарантируя, что новые элементы не будут появляться в результате), а array_merge заменяет значения в $base этими новыми значениями из $replace (при условии, что ключи появляются только в $base сохранит свои исходные значения).

Смотрите в действии .

Интересно отметить, что тот же результат может быть достигнут с порядком обращений:

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

Однако эта версия немного больше работает, поэтому я рекомендую первую.

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

Я не могу думать о встроенном методе для этого, однако, это было бы тривиально с циклами и array_key_exists .

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

это должно сделать следующее:

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

Попробуй это:

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