无尘阁日记

无尘阁日记

为什么交换数组顺序,array_intersect_assoc() 的结果依然不变?这篇文章讲透了!
2025-11-18

为什么交换数组顺序,array_intersect_assoc() 的结果依然不变?这篇文章讲透了!

在 PHP 开发中,array_intersect_assoc() 是一个常用但常被误解的数组函数。很多人知道它用于求 数组交集(同时比较键和值),但一提到交换参数顺序是否影响结果,就开始犹豫了:

“顺序换了,结果会变吗?”

“难道只是顺序变,不是内容变?”

“它不是按照第一个数组来比对吗?”

别急,这篇文章带你一次讲透。

一、array_intersect_assoc() 是做什么的?

这是 PHP 提供的“带键值对匹配的交集函数”。

它与 array_intersect() 最大的不同在于:

键和值都必须在所有数组中相同,才会保留

也就是说:

  • 你传入几个数组

  • 某键值对想留下来

  • 必须 在每个数组中都存在且一致

二、最重要的误区:顺序会影响结果吗?

先给结论:

交换数组顺序不会改变最终交集结果的内容。

为什么?

因为这是数学意义上的交集:

A ∩ B ∩ C = C ∩ B ∩ A

只要键值对存在于所有数组,它就是交集的一部分。
顺序换来换去,它依然在所有数组里。

三、但顺序会影响什么?

影响的是 结果中的排列顺序

原因很简单:

结果数组的顺序总是保持“第一个数组”中的顺序

也就是说:

换哪个做第一个数组,就按那个排。

四、最关键的逻辑(看懂就彻底明白了)

array_intersect_assoc() 的过程可以理解为:

遍历第一个数组
   ↓
每遇到一个键值对
检查其他数组是否都包含它
   ↓
全部包含 → 保留
不包含 → 丢弃

于是:

  • 第一个数组决定了返回顺序

  • 全部数组决定了交集内容

五、举个例子让你 3 秒看懂

例子数组:

$a = ['k1' => 1, 'k2' => 2];
$b = ['k2' => 2, 'k1' => 1];
$c = ['k1' => 1, 'k2' => 2];

调用方式 1:

array_intersect_assoc($a, $b, $c);

结果:

['k1' => 1, 'k2' => 2]

调用方式 2:

array_intersect_assoc($b, $a, $c);

结果:

['k2' => 2, 'k1' => 1]

两次结果对比:

  • 键值对内容一样(交集一样)

  • 顺序不同(受第一个数组影响)

六、用一句话总结

array_intersect_assoc() 获取的是所有数组的键值交集,
不会因为参数交换而改变结果内容,
但返回顺序永远跟第一个数组一致。

七、你今天学到了什么?

  • 它不是简单交集,是“键 + 值”双比较交集

  • 必须 全部数组都包含才保留

  • 参数顺序不影响交集内容

  • 返回顺序永远基于第一个数组

八、如果你还想研究更多

建议了解:

  • array_intersect()

  • array_intersect_key()

  • array_diff_assoc()

  • array_diff_key()

这样你就能组合出更多操作方式。

这篇文章适合谁转发?

  • PHP 初学者

  • 面试中常被问到的同事

  • 团队代码 review 时还写错的人

  • 想看透 PHP 数组行为细节的开发者

想让更多人理解?
只需把这篇文章丢给他们:

“看完你就不再误会这个函数了。”

完。