如何从数组中删除不在另一个数组中的键?

时间:2010-10-19 16:14:17

标签: php arrays

我有以下两个数组:

  

修改

     

来自@Wrikken的建议我   清理了第一个阵列,现在有了   这样:

First Array:

Array
(
    [0] => 3
    [1] => 4
    [2] => 9
    [3] => 11
)

第二阵列:

Array
(
    [3] => stdClass Object ( [tid] => 3 )

    [12] => stdClass Object ( tid] => 12 )

    [9] => stdClass Object ( [tid] => 9 )
)
  

修改

     

正在过滤第二个数组   第一个数组。第二个阵列有   3,12,9。第一个阵列没有   包含12,所以应删除12   来自第二个阵列。

所以我最终应该:

Array
(
    [3] => stdClass Object ( [tid] => 3 )

    [9] => stdClass Object ( [tid] => 9 )
)

5 个答案:

答案 0 :(得分:6)

你可以这样做:

$keys = array_map(function($val) { return $val['value']; }, $first);
$result = array_intersect_key(array_flip($keys), $second);

array_map调用将从$first中提取值,以便$keys是这些值的数组。然后array_intersect_key用于获取$keys(翻转以将键用作值,反之亦然)和第二个数组$second的交集。

答案 1 :(得分:6)

经过一些清理之后,我非常清楚我需要什么,而这一点点排除了它:

foreach ($second_array as $foo) {
  if (!in_array($foo->tid, $first_array)) {
    unset($second_array[$foo->tid]);
  }
}   

答案 2 :(得分:2)

array_filter

中使用回调

如果您的第一个数组真的如此,您可能希望在更实用的一维数组中更改它,因此您可以使用简单的in_array作为回调的一部分:

$values = array_map('reset',$array);

我现在才看到钥匙和钥匙object-id是相似的:

$result =  array_intersect_key($objectarray,array_flip(array_map('reset',$array)));

答案 3 :(得分:1)

由于您要过滤数组(通过另一个数组中包含的所有键),因此可以使用array_filter函数。

$first  = [3,4,9,11];
$second = [ 3 => 'A' , 9 => 'B' , 12 => 'C'];

$clean = array_filter($second, function($key)use($first){
            return in_array($key,$first);
          },
           ARRAY_FILTER_USE_KEY);

// $clean = [ 3 => 'A' , 9 => 'B'];

ARRAY_FILTER_USE_KEY常量是函数的第三个参数,因此$key实际上是回调中$second数组的键。可以调整:

  

标记,确定将哪些参数发送给回调(第3个参数):

ARRAY_FILTER_USE_KEY - pass key as the only argument to callback instead of the value
ARRAY_FILTER_USE_BOTH - pass both value and key as arguments to callback instead of the value
     

默认为0,它将值作为回调的唯一参数传递   代替。

答案 4 :(得分:0)

对于关联数组,可以使用简单的键白名单过滤器:

$arr = array('a' => 123, 'b' => 213, 'c' => 321); 
$allowed = array('b', 'c'); 

print_r(array_intersect_key($arr, array_flip($allowed))); 

会返回:

Array 
( 
    [b] => 213 
    [c] => 321 
)
相关问题