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

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

$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 с обратным вызовом.

Ответы [ 2 ]

17 голосов
/ 03 июля 2011

Это следует сделать, если я правильно понимаю вашу логику:

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*"
}
0 голосов
/ 22 ноября 2016

если вы хотите, чтобы второй массив ($ b) был шаблоном, который указывает, что, если там есть только ключ, то вы также можете попробовать это

$new_array =  array_intersect_key( $filtered, $changed ) + $changed;
...