array_intersect 获取数组交集,严格匹配怎么实现

胖杰同学_2451

胖杰同学_2451

2026-10-09

340人浏览

原创

array_intersect() 默认松散比较(==),导致0=='0'等非预期结果;需用array_uintersect+严格三路比较函数或array_filter+in_array($item,$b,true)实现严格匹配。

array_intersect 获取数组交集,严格匹配怎么实现

PHP 中 array_intersect() 默认是**松散比较(==)**,即不严格检查类型。要实现**严格匹配(===)**——要求值相等且类型相同——不能直接用它,需手动处理或改用其他方式。

为什么 array_intersect 不严格?

它内部使用的是 PHP 的 == 比较,比如 0 == '0'、0 == false 都为 true,会导致非预期的交集结果。

用 array_uintersect + 自定义比较函数(推荐)

这是最直接、语义清晰的方式:用 array_uintersect() 并传入一个严格比较的回调函数(如 function($a, $b) { return $a === $b ? 0 : ($a > $b ? 1 : -1); })。

Stitch
Stitch

Stitch是一款AI图像与设计工具,Google Labs 推出的 AI 原生设计工具。

下载
  • 必须返回整数:0 表示相等,正数表示 $a > $b,负数表示 $a
  • 注意:PHP 要求该函数满足“三路比较”逻辑,不能只返回 true/false
  • 示例:
$a = [0, '0', false, 1];
$b = ['0', 1, 2];

$result = array_uintersect($a, $b, function($x, $y) {
    return $x === $y ? 0 : ($x > $y ? 1 : -1);
});
// 结果:['0', 1] —— 只有字符串'0'和整数1同时存在于两数组且类型一致

用 array_filter + in_array(严格模式)

对第一个数组逐个判断是否在第二个数组中存在严格相等的元素:

  • 使用 in_array($item, $array, true),第三个参数设为 true 启用严格比较
  • 适合小到中等规模数组;大数组时性能略低于 array_uintersect(因每次调用都遍历)
  • 示例:
$a = [0, '0', false, 1];
$b = ['0', 1, 2];

$result = array_filter($a, function($item) use ($b) {
    return in_array($item, $b, true);
});
$result = array_values($result); // 重置键名(可选)
// 结果:['0', 1]

提前转成统一类型再交集(慎用)

仅当业务允许且类型差异有明确映射规则时可用,例如全部转字符串或全部转整型:

  • 用 array_map('strval', $arr) 后再用 array_intersect()
  • 但会丢失原始类型信息,比如 false 和 0 都变 '0',无法区分
  • 不推荐用于需要保留类型语义的场景

不复杂但容易忽略:严格交集的关键在于比较逻辑,而不是交集函数本身。选 array_uintersect 配合三路比较函数,是最贴近原生风格又可靠的做法。

相关专题

更多
FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

40

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

140

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

140

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

100

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

100

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

120

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

320

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

220

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

180

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php面试题实战视频教程
php面试题实战视频教程

共12课时 | 4.6万人学习