2010-11-21 18 views
47

私は入力としてキーの配列を取り、私に対応する値を返す組み込みPHP関数を探しています。キーで配列の値を取得

私は、次の配列

$arr = array("key1"=>100, "key2"=>200, "key3"=>300, 'key4'=>400); 

を持っていると私は、入力として、この配列と最初の配列をとる機能を必要とし、私の中に値を提供ので、私は別のarray("key2", "key4") を持つキーKEY2KEY4の値を必要とします応答。応答はarray(200, 400)

+1

私はあなたが求めている正確に理解していません。あなたは入力と出力の例を使って明らかにすることができますか? – BudgieInWA

答えて

94

array_intersect_keyと思われます。例:

array_intersect_key(array('a' => 1, 'b' => 3, 'c' => 5), 
        array_flip(array('a', 'c'))); 

を返します:

array('a' => 1, 'c' => 5); 

あなたは少しシンプルなコードを持っているしたい場合は、array('a' => '', 'c' => '')代わりのarray_flip(...)を使用することができます。

アレイキーは保存されています。シーケンシャルアレイが必要な場合は、その後array_valuesを使用する必要があります。

+0

すてきな答え、もっと短い方法がありますか? –

+0

そうは思わない。 array_flip(...)の代わりにarray( 'a' => ''、 'c' => '')を書くこともできますが、それは私にとって意味が違うようです。 – Andrew

+2

これは連想配列を返しますので、OPの例では 'array(200,400)'を返すのではなく 'array( 'key2' => 200、 'key4' => 400)'を返します。 – Amber

4
foreach($input_arr as $key) { 
    $output_arr[] = $mapping[$key]; 
} 

これは$mappingにおけるキー - >値のマッピングに基づいて、$input_arrのキーのリストに対応する値を有する$output_arrをもたらすであろう。あなたがしたい場合は、関数の中でそれを包むことができます:

function get_values_for_keys($mapping, $keys) { 
    foreach($keys as $key) { 
     $output_arr[] = $mapping[$key]; 
    } 
    return $output_arr; 
} 

次に、あなただけのように同じようにそれを呼び出します。価値が提示ソリューションについてなされるべきことを

$a = array('a' => 1, 'b' => 2, 'c' => 3); 
$values = get_values_for_keys($a, array('a', 'c')); 
// $values is now array(1, 3) 
4

一つの考慮事項は、(array_intersect_keyを使用することです)、2番目の引数に重複した値があると、array_flip()に渡すときに上書きされます。これは、明らかに配列インデックスが一意であるためです。

これはフリップがないため、第2のアプローチでは発生しないため、場合によっては適切になります。

+0

+1私はあなたの説明を –

13

代替答え:

$keys = array("key2", "key4"); 

return array_map(function($x) use ($arr) { return $arr[$x]; }, $keys); 
+0

いいです!私はあなたのメソッドを使用し、それを関数にラップしました。 –

+0

私はこのことが好きです。なぜなら、私にとって理解するのがはるかに簡単だからです。 – racl101