通过值数组的键组合键和值数组

时间:2012-12-17 15:17:17

标签: php arrays

我有两个阵列。

$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');

我想要做的是以这样的方式组合这两个数组,我将获得一个由$keys数组过滤的数组。您可以说$values数组会反映到$keys数组,该数组会返回一个已过滤的数组,如果$values的键等于其中一个,则只显示$values $keys数组中的值。

这个问题很难用文字来解释,所以上面我的问题相当于下面的问题:

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%正确,但我只是好奇是否有其他/更好的解决方案。我有一些更高级的代码片段,我想使用它(递归)但这对于这个问题来说有点太多了,因为答案是相同的。

1 个答案:

答案 0 :(得分: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)