Intereting Posts
Проблема с выделенной областью связи LinkedIn с библиотекой PHP Оптимизация маршрутов каркаса Zend Есть ли возможность использовать услугу Audio chat из Google в мой веб-приложение? Итерация через множественный массив и выполнение функции 2 текстовых файла автозаполнения с данными из 2 таблиц Как анализировать URL-адрес Zend для параметров? Исходный код PHP base64 не правильно декодирован в Javascript Mysql выбирает самую старую запись для каждого пользователя изменить формат времени в запросе mysql ORDER BY обрезать изображение после изменения размера в библиотеке GD Как изменить внешний вид URL-адреса из PHP-скрипта Объединение запроса AND / OR в Laravel Аутентификация отпечатка пальца в Интернете Является ли Symfony лучшим выбором, чем Zend для магазина веб-разработки (10+), потому что это полноценная структура стека? Потребление не подтверждается сообщениями от RabbitMq

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

Я хотел бы объединить два массива друг с другом:

$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;