如何在PHP中使用键数组过滤关联数组


How to filter an associative arrays using array of keys in PHP?

我有一个关联数组和一个键数组。

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen');
$B = array('a', 'b');

如何从$A的所有元素中建立一个关联数组,其中键在$B中?对于上面的例子,答案应该是

$C = array('a'=>'book', 'b'=>'pencil');
$keys = array_flip($B);
$C = array_intersect_key($A,$keys);

array_intersect_key($A,array_combine($B,$B))

或更好:array_intersect_key($my_array, array_flip($allowed))

从问题:PHP:如何使用array_filter()来过滤数组键?

这里有一个简单的解决方案,在将密钥附加到$C之前检查$A中是否存在密钥

$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"
}
$keys = array_keys($B);
$C = array();
foreach ($A as $key => $value)
{
  if (in_array($key, $keys))
  {
    $C[$key] = $value;
  }
}

令我非常惊讶的是,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";