PHP中如何根据另一数组的ID值筛选关联数组?
实现PHP数组按指定ID筛选的几种方法
这需求在日常PHP开发里太常见啦,给你分享几种实用的实现方式,你可以根据自己的代码场景和PHP版本来选:
方法一:用array_filter()+索引优化(推荐,效率高)
array_filter()是PHP原生的数组过滤函数,配合array_flip()把目标ID数组转成索引数组后,查找效率会大幅提升(尤其是当$b里的元素很多时):
$a = array( array('id' => 1, 'name' => "Facebook"), array('id' => 2, 'name' => "Twitter"), array('id' => 3, 'name' => "Google"), array('id' => 4, 'name' => "Linkdin"), array('id' => 5, 'name' => "Github"), ); $b = array(1, 3, 5); // 把$b转成以ID为键的关联数组,将O(n)的in_array查找变成O(1)的isset判断 $allowedIds = array_flip($b); // 过滤出id在允许列表里的元素 $result = array_filter($a, function($item) use ($allowedIds) { return isset($allowedIds[$item['id']]); }); // 可选:如果需要重置数组的索引(array_filter会保留原数组的索引) $result = array_values($result);
方法二:foreach循环遍历(最直观,适合新手理解)
如果觉得闭包有点抽象,用foreach循环逐个判断也很清晰,逻辑一目了然:
$a = array( array('id' => 1, 'name' => "Facebook"), array('id' => 2, 'name' => "Twitter"), array('id' => 3, 'name' => "Google"), array('id' => 4, 'name' => "Linkdin"), array('id' => 5, 'name' => "Github"), ); $b = array(1, 3, 5); $result = array(); foreach ($a as $item) { // 检查当前元素的id是否在$b的列表中 if (in_array($item['id'], $b)) { $result[] = $item; } }
小贴士:如果$b的元素数量较多,同样建议先把$b转成
array_flip()后的索引数组,把in_array()换成isset(),能显著提升运行速度。
方法三:PHP 7.4+ 短闭包写法(极简风格)
如果你的项目已经升级到PHP 7.4及以上,用短闭包(Arrow Functions)可以把代码压缩得非常紧凑,可读性也不错:
$a = array( array('id' => 1, 'name' => "Facebook"), array('id' => 2, 'name' => "Twitter"), array('id' => 3, 'name' => "Google"), array('id' => 4, 'name' => "Linkdin"), array('id' => 5, 'name' => "Github"), ); $b = array(1, 3, 5); $allowedIds = array_flip($b); $result = array_values(array_filter($a, fn($item) => isset($allowedIds[$item['id']])));
补充说明
- 如果不需要重置结果数组的索引,可以去掉
array_values(),保留原数组的索引值; - 如果$b里存在重复的ID,
array_flip()会自动去重(因为关联数组的键是唯一的),但这不影响最终筛选结果,我们只关心ID是否存在。
内容的提问来源于stack exchange,提问作者Optimus Prime
相关产品推荐
相关产品推荐

