私は、連想配列とキーの配列を持っています。私は鍵が$B
である$A
のすべての要素から連想配列を構築する方法PHPでキー配列を使用して連想配列をフィルタリングする方法はありますか?
$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen');
$B = array('a', 'b');
? 上記の例では、答えは
$C = array('a'=>'book', 'b'=>'pencil');
私は、連想配列とキーの配列を持っています。私は鍵が$B
である$A
のすべての要素から連想配列を構築する方法PHPでキー配列を使用して連想配列をフィルタリングする方法はありますか?
$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen');
$B = array('a', 'b');
? 上記の例では、答えは
$C = array('a'=>'book', 'b'=>'pencil');
$keys = array_keys($B);
$C = array();
foreach ($A as $key => $value)
{
if (in_array($key, $keys))
{
$C[$key] = $value;
}
}
でなければなりません。ここ$C
$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen');
$B = array('a', 'b');
$C = array();
foreach ($B as $bval) {
// If the $B key exists in $A, add it to $C
if (isset($A[$bval])) $C[$bval] = $A[$bval];
}
var_dump($C);
// Prints:
array(2) {
["a"]=>
string(4) "book"
["b"]=>
string(6) "pencil"
}
明らかに間違っている::/
次の簡単なベンチマークスクリプトは私に結果が得られます。 OPは配列を別のものでフィルタリングする必要がありますが、あなたの解決策ではありません。そして '$ C'の結果は連想配列でなければなりません。 –
'$ C'を編集しました –
明らかに仕事しています;) –
array_intersect_key($A,array_combine($B,$B))
かにそれを追加する前にキーが$A
に存在することを確認し、簡単なソリューションですより良い:array_intersect_key($my_array, array_flip($allowed))
$keys = array_flip($B);
$C = array_intersect_key($A,$keys);
私の巨大な驚きには、foreachループの方法が高速です。 array_intersect_key: 0.76424908638 foreach loop: 0.6393928527832
$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen');
$B = array('a', 'b');
$start = microtime(true);
for ($i = 0 ; $i < 1000000; $i++) {
$c = array_intersect_key($A,array_flip($B));
}
$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$C = array();
foreach ($B as $bval) {
// If the $B key exists in $A, add it to $C
if (isset($A[$bval])) $C[$bval] = $A[$bval];
}
}
$t2 = microtime(true);
echo "array_intersect_key: " . ($t1 - $start), "\n";
echo "foreach loop: " . ($t2 - $t1), "\n";
恐ろしい\ o /(さらに15文字に達する文字)。 –
答えをありがとう。 – Fazri