2013-08-14 13 views
8

ある配列の要素をの値で上書きしようとしていますが、を追加するとプロセスに追加の要素が作成されます。例えばキーを作成せずにPHP array_replace

array('a' => 'orange', 'b' => 'grape'); // 'c' not included 

array_merge又はarray_replaceを使用して適切に要素を上書きするだろうが、得られた配列は見出されていない要素を含むであろう:

$base = array('a' => 'apple', 'b' => 'banana'); 
$replace = array('a' => 'orange', 'b' => 'grape', 'c' => 'cauliflower'); 

を作成するアレイをマージ最初の配列で。

2つの配列を組み合わせて、最初の配列のキーと2番目の配列の対応する値のみを含む配列を作成するにはどうすればよいですか?

これを行うための既存のPHP配列関数はありますか?

ありがとうございました!

答えて

12

あなたはそれを行うにはarray_intersect_keyarray_mergeを使用することができます。

$result = array_merge($base, array_intersect_key($replace, $base)); 

array_intersect_keyはすでに$baseに存在するキーで$replaceのそれらの要素を分離(新しい要素が結果に表示されないようにする)、array_mergeは値を置き換えます$base$replaceの新しい値を使用します(ただし、$baseにのみ表示されるキーは元の値を保持します)。

See it in action

同じ結果にも逆転の呼び出しの順序で到達することができることに注意することは興味深いです:

$result = array_intersect_key(array_merge($base, $replace), $base); 

しかし、このバージョンは少しより多くの仕事をするので、私は最初のものをお勧めします。

+0

理由だけではなくarray_intersect_key($、$ベースを交換しますか)?ドキュメントをチェックしている間[link] http://www.php.net/manual/en/function.array-intersect-key.php "キーの値が青と緑で異なることに気付くキーだけがチェックされているので、一致がまだ発生します。返される値はarray1のものです。だから私はarray_mergeが必要だとは思っていません.. – coderkane

+0

@coderkane: '$ replace'に' $ base'が持つすべてのキーが含まれていない場合、結果に欠損値があります。 – Jon

+0

私は知っていますが、OPは彼が2番目の配列からのみ値を求めていると言っていました。しかし、彼はそのシナリオを予見しなかった可能性があるので、良い点を指摘する。 – coderkane

0

私はそれのための方法を考えることはできませんが、それはループとarray_key_existsと些細なことだろう。

foreach($replace as $k => $v) 
{ 
    if (array_key_exists($k, $base)) 
     $base[ $k ] = $v; 
} 
0

次はそれを行う必要があります。

foreach ($replace as $k => $v) 
    if (isset($base[$k])) $base[$k]=$v; 
3
print_r(array_intersect_key($replace, $base)); 
+0

これは正確で、彼らが来るほど効率的です。 – Floris

+0

ありがとうございました!私は単純な解決策がなければならないことを知っていました。 – Jason

+2

@ Jason: '$ replace'が' $ base'のすべてのキーの値を持っていなければ、 "missing"キーは結果に全く現れないことに注意してください。 – Jon

0

これを試してみてください:

$result = array_replace($base, array_intersect_key($replace, $base)); 
関連する問題