Я хотел бы объединить два массива друг с другом:
$filtered = array(1 => 'a', 3 => 'c'); $changed = array(2 => 'b*', 3 => 'c*');
В то время как слияние должно включать в себя все элементы $filtered
и все те элементы из $changed
которые имеют соответствующий ключ в $filtered
:
$merged = array(1 => 'a', 3 => 'c*');
array_merge($filtered, $changed)
добавит дополнительные ключи $changed
в $filtered
. Так что это не очень подходит.
Я знаю, что я могу использовать $keys = array_intersect_key($filtered, $changed)
чтобы получить ключи, которые существуют в обоих массивах, которые уже составляют половину работы.
Однако мне интересно, есть ли какая-либо (родная) функция, которая может уменьшить $changed
массив в массив с $keys
указанными array_intersect_key
? Я знаю, что могу использовать array_filter
с функцией обратного вызова и проверять на него $keys
, но есть, вероятно, какая-то другая чисто нативная функция для извлечения только тех элементов из массива, из которых ключи могут быть указаны?
Я спрашиваю, потому что собственные функции часто намного быстрее, чем array_filter
с обратным вызовом.
Это должно сделать это, если я правильно понимаю вашу логику:
array_intersect_key($changed, $filtered) + $filtered
Реализация:
$filtered = array(1 => 'a', 3 => 'c'); $changed = array(2 => 'b*', 3 => 'c*'); $expected = array(1 => 'a', 3 => 'c*'); $actual = array_key_merge_deceze($filtered, $changed); var_dump($expected, $actual); function array_key_merge_deceze($filtered, $changed) { $merged = array_intersect_key($changed, $filtered) + $filtered; ksort($merged); return $merged; }
Вывод:
Expected: array(2) { [1]=> string(1) "a" [3]=> string(2) "c*" } Actual: array(2) { [1]=> string(1) "a" [3]=> string(2) "c*" }
если вы хотите, чтобы второй массив ($ b) был шаблоном, который указывает, что если есть только ключ, вы также можете попробовать это
$new_array = array_intersect_key( $filtered, $changed ) + $changed;