2012-01-04 3 views
2

考えると二つの配列交差:PHPの配列は、(一種の)

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

を組み込みのPHP関数、次の結果配列を生成することがありますか?

$result = array('a' => 1, 'b' => 2, 'c' => 3); 

私はphp.netにArray Functionsリストを進めてきたが、私が探しているものを見つけるように見えることはできません。私はそれが必要な場合は自分自身で行う方法を知っていますが、これは一般的な問題であると考えていました。それは、それを行い、ホイールを再構成したくない組み込み関数かもしれません。

+0

基本的にバーのキーが$ fooに一致する値を持つ$ barからキー/ valのペアを引き出しますか? –

+0

明確にする:最初の配列に一致するキーを持つ2番目の配列から値を抽出しますか? – ManseUK

+0

はい、2番目の配列( '$ bar')の要素を持ち、最初の配列のキー(' $ foo')のみを持つ結果の配列が必要です。 – FtDRbwLXw6

答えて

6

別の方法:

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

$common = array_intersect_key($bar, array_flip($foo)); 

出力

array(3) { 
    ["a"]=> 
    int(0) 
    ["b"]=> 
    int(1) 
    ["c"]=> 
    int(2) 
} 
+0

array_intersect_key()への引数の順序を逆にして元の$ bar配列の値を維持する –

+0

@マークベイカー。よかった!ありがとう。 – Josh

+0

これは私が投稿したソリューションと非常によく似ていますが、私が 'array_fill_keys($ foo、NULL)'を使用しているため、 'array_flip($ foo)'を使用しています。 – FtDRbwLXw6

0

掲示した後、私はこれを行うための一つの方法と考えた:

array_intersect_key($bar, array_fill_keys($foo, NULL)) 

けれども、これは本当に私が望んでいた簡潔な、組み込み関数ではありません、それは間違いなく結果を構築するよりはましです手動で配列を作成します。

+2

array_flip($ foo、NULL)は、array_flip($ foo) –

+0

で置き換えることができます@MarkBaker:私は、非連想配列に対して 'array_flip()'を使うことは考えていませんでした。それはすてきなトリックです、ありがとうございます。 – FtDRbwLXw6

+0

それを使用する最良のタイプの配列....重複する値が重複して上書きされる危険性なし –

1

それは汚いハックのビットですが、それは動作します:

function extractKeys($keys, $data) { 
    extract($data); 

    return call_user_func_array('compact', $keys); 
} 

$foo = array('a', 'b', 'c'); 
$bar = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

var_dump(extractKeys($foo, $bar)); 

出力:array_fliparray_intersect_keysを使用して

array(3) { 
    ["a"]=> 
    int(1) 
    ["b"]=> 
    int(2) 
    ["c"]=> 
    int(3) 
}