php数组如何筛选两个数组交集_php数组交集筛选实现法【技巧】

array_intersect()按值松散比较返回首数组中在其他数组均存在的元素并保留原键名;不支持多维数组,类型敏感需手动实现,性能优化可用array_flip()+isset()。

php数组如何筛选两个数组交集_php数组交集筛选实现法【技巧】

array_intersect() 获取两个数组的值交集

直接用 array_intersect() 就行,它按值比较,返回第一个数组中在其他所有数组里都存在的元素,键名保留原样。注意它不关心键名,只看值是否相等(松散比较)。

  • 如果数组里有字符串 "1" 和整数 1,会被当作相同值处理
  • 浮点数和整数也可能被误判相等,比如 1.01
  • 多维数组不能直接用——array_intersect() 会把子数组当成 Array 字符串来比,结果永远为空

示例:

$a = ['a' => 1, 'b' => 2, 'c' => 3];
$b = [2, 3, 4];
$result = array_intersect($a, $b); // 返回 ['b' => 2, 'c' => 3]

要严格类型匹配?改用 array_intersect_assoc() 或手动遍历

array_intersect_assoc() 同时校验键名和值,但依然做松散比较。真要类型敏感(比如区分 1"1"),得自己写循环或用 array_filter() 配合 in_array(..., ..., true)

  • in_array(1, ["1", 2], true) 返回 false,因为开启严格模式后类型不同
  • array_filter($a, fn($v) => in_array($v, $b, true)) 可实现严格值交集
  • 若还需保留原始键名,别用 array_values() 重置,否则会丢键

筛选交集的同时保留键名对齐?试试 array_intersect_key()

当你要的是「键名相同且值也存在」的交集,而不是「值相同」,就得换函数。array_intersect_key() 只比键名,不管值内容;配合 array_intersect() 手动组合才能兼顾两者。

  • array_intersect_key($a, $b) 返回 $a 中键名也在 $b 中出现的元素(值照搬,不校验值本身)
  • 想同时满足“键存在”+“值也存在”,得两步:先 array_intersect_key() 缩小范围,再 array_intersect() 筛值
  • 注意关联数组键名是字符串,数字键如 01 会被 PHP 自动转成整型,比对时容易出意外

大数据量下性能明显变慢?避免嵌套 in_array()

手动遍历时用 in_array() 在大数组里查值,时间复杂度是 O(n×m),很容易卡住。更优解是先把第二个数组用 array_flip() 转成键值互换的哈希表,再用 isset() 判断——后者接近 O(1)。

数说Social Research

数说Social Research

社媒领域的AI Agent,全能营销智能助手

下载

立即学习PHP免费学习笔记(深入)”;

  • $b_keys = array_flip($b); $result = array_filter($a, fn($v) => isset($b_keys[$v]));
  • 这招对字符串和整数最有效;含空值、null、对象的数组需额外判断,因为 array_flip() 会丢弃重复值和非法键
  • 如果 $b 本身键名有意义(比如是配置项 ID 列表),翻转前先确认没重复值,否则会静默丢失

交集逻辑看着简单,但键名保留、类型安全、性能边界这三点,随便漏一个就可能在线上吐异常或返回空数组。实际用时先盯紧数据类型和规模,再选函数。

https://www.php.cn/faq/2035208.html

发表回复

Your email address will not be published. Required fields are marked *