Я пытаюсь переписать элементы одного массива значениями из другого – без создания дополнительных элементов в процессе.
Например:
$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));