使用array_filter()或array_entersect()可以使用一维数组按一列筛选二维数组



我正在尝试用第二个数组过滤第一个数组。我想筛选每个年龄为22253540的人。我将这些白名单值存储在$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));

相关内容

最新更新