2012-03-17 22 views
1
$array1 = ['key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3'] 
$array2 = ['key1','key3'] 

配列2のキーを持つ配列1からすべての要素を取得したいとします。 だから結果は次のようになります。アーク配列の要素をキーの配列で取得する

$result = ['key1'=>'val1', 'key3'=>'val3'] 

私はarray_intersect_keyを試してみました($配列1、配列2 $)が、それは動作しません。上記の結果を得る最速の方法は何ですか?

編集:配列2は、連想配列または単一次元かもしれません。 array_flip()を使用

$result = array_intersect_key($array1,array_flip($array2)); 

はEDIT

それがあれば関係ないことをやって:あなたは)(array_intersect_key使用することができます前に、

答えて

6

あなたがkey1を作成する必要があり、二番目の配列のキーをKEY2 $の配列2は、連想かではありません。

$array1 = array('key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3'); 
$array2 = array('first'=>'key1','second'=>'key3'); 

$filteredData = array_intersect_key($array1,array_flip($array2)); 
var_dump($filteredData); 

はまだ

を与えます
array 
    'key1' => string 'val1' (length=4) 
    'key3' => string 'val3' (length=4) 
+0

編集を参照してください.Array2が連想配列の場合は動作しません。 – firebird

+0

あなたの$ array2が実際に何であるかを示します:array_flip()は連想配列で使用されているかどうかを気にしてはいけません。 –

0

ない純粋なエレガントなワンライナー10は、それがうまくいく:

$result = array(); 

foreach($array2 as $key) { 
    $result[$key] = $array1[$key]; 
} 

対応して編集するだけvalues($array2)を使用しています。

1
function my_intersect($a1, $a2){ 
    $func = function(&$v, $k) { 
     $v = (is_string($k)) ? $k : $v; 
    }; 
    array_walk($a2, $func); 
    $a2 = array_fill_keys(array_values($a2),1); 
    $ret = array(); 
    if ($a1){ 
     foreach($a1 as $k => $v){ 
      if (array_key_exists($k, $a2)){ 
       $ret[$k] = $v; 
      } 
     } 
    } 
    return $ret; 
} 

私はこれがアスカーが望んでいると思いますか?おそらく良い方法。

関連する問題