我有以下两个数组:
修改
来自@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 )
)
答案 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)
如果您的第一个数组真的如此,您可能希望在更实用的一维数组中更改它,因此您可以使用简单的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
)