0

私は2つの配列を持っています。

$keys = array(1,2,3,6,9); //note that 9 does not exist as key in the $values array
$values = array('000', '001', '002', '003', '004', '005', '006', '007');

私がやりたいことは、これらの 2 つの配列を組み合わせて、配列によってフィルター処理された配列を取得すること$keysです。配列は、配列のキーが配列内の値の 1 つと等しい場合にのみ表示されるフィルター処理された配列を返す配列に$values反映されていると言えます。$keys$values$values$keys

質問を言葉で説明するのは難しいので、上記の私の質問に相当するものは、ここの foreach にあります。

foreach ($keys as $k){
    if (!array_key_exists($k, $values)){ continue; } //prevents $k=9 as key in the $values array
    $new[$k] = $values[$k];
}
print_r($new); // Array ( [1] => 001 [2] => 002 [3] => 003 [6] => 006 )

array_mergearray_combinearray_diff、および/またはarray_uniqueの組み合わせで可能になるはずですが、解決策がわかりません。上記の foreach がこれを行うための最良の方法である可能性がありますが、これを行うための別の優れた方法があるに違いないと想像できます。したがって、私の質問は基本的に次のとおりです。より少ないコードで同じ目標を達成する別の方法はありますか?

配列に存在するキーはわかっていますが、それらを適切な方法で$values反映する必要があります。$values

$keys_in_values = array_intersect($keys, array_keys($values));
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 6 )

ここで、なぜ foreach だけを使用しないのかと疑問に思われるかもしれません。ええと、答えはかなり簡単です。したくないから。私は 100% 正しいように見えますが、他の/より良い解決策があるかどうかに興味があります。これを(再帰的に)使用したい、より高度なコードがいくつかありますが、答えは同じになるため、この質問には少し多すぎます。

4

1 に答える 1

3

必要なのはarray_intersect_key+array_flip

$data = array_intersect_key($values, array_flip($keys));
var_dump($data);

出力

array (size=4)
  1 => string '001' (length=3)
  2 => string '002' (length=3)
  3 => string '003' (length=3)
  6 => string '006' (length=3)
于 2012-12-17T15:25:02.647 に答える