我正在尝试用第二个数组过滤第一个数组。我想筛选每个年龄为22
、25
、35
或40
的人。我将这些白名单值存储在$a2
中
$a1 = [
['name' => 'mike', 'age' => 18],
['name' => 'james', 'age' => 22],
['name' => 'sarah', 'age' => 35],
['name' => 'ken', 'age' => 29],
];
$a2 = [22, 25, 35, 40];
我试过array_intersect()
,比如:
$results = array_intersect($a2, $a1['age']);
var_dump($results);
和array_filter()
,但没有成功。
我想要的输出是:
[
['name' => 'james', 'age' => 22],
['name' => 'sarah', 'age' => 35]
]
array_uintersect()
,它允许您比较两个数组之间的相交值。事实上,您有不同深度的数组,这意味着您将需要一个自定义回调。在该回调中,您不能确定$a1
值将在临时变量$a
中表示,也不能确定$a2
值将在$b
中表示。要正确处理每次迭代,请检查age
键,否则返回到基变量(。
代码:(演示(
$a1 = [
['name' => 'mike', 'age' => 18],
['name' => 'james', 'age' => 22],
['name' => 'sarah', 'age' => 35],
['name' => 'ken', 'age' => 29],
];
$a2 = [22, 25, 35, 40];
var_export(
array_uintersect(
$a1,
$a2,
fn($a, $b) => ($a['age'] ?? $a) <=> ($b['age'] ?? $b)
)
);
或者,一种更简洁的方法涉及在array_filter()
调用中对in_array()
进行迭代调用。一般来说,我强烈建议不要对in_array()
进行迭代调用,因为in_array()
是对数组值进行检查的最慢方法之一。根据两个输入数组的实际大小,以下代码段的性能可能比array_uintersect()
更好或更差——我没有做任何基准测试。
代码:(演示(
var_export(
array_filter($a1, fn($row) => in_array($row['age'], $a2))
);
array_incross和array_diff不能很好地处理多维数组。
试试这个,看看如何工作:
$a = [1,2,3,4];
$b = [2,7,8,9];
var_dump(array_intersect($a,$b));
结果应该是[2]。如果你使用多维数组,并且只对一列数组感兴趣,那么首先做:
$age = array_column($a1,'age');
然后
var_dump(array_intersect($age,$a2));