8

2 つの配列を互いにマージしたいと思います。

$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た配列に縮小できる(ネイティブ)関数があるかどうか疑問に思っています? コールバック関数を使用してチェックできることはわかっていますが、キーを指定できる配列から要素のみを抽出する純粋なネイティブ関数が他にあるのではないでしょうか?$keysarray_intersect_keyarray_filter$keys

array_filterネイティブ関数は多くの場合、コールバックよりもはるかに高速であるため、私が尋ねています。

4

3 に答える 3

19

あなたのロジックを正しく理解していれば、これでうまくいくはずです:

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*"
}
于 2011-07-03T10:18:39.273 に答える