当前位置: 首页> 最新文章列表> array_intersect_ukey 和 array_intersect_key 有什么区别?详细对比解析

array_intersect_ukey 和 array_intersect_key 有什么区别?详细对比解析

gitbox 2025-06-25

1. array_intersect_key 函数简介

array_intersect_key 函数用于比较多个数组的键名,返回所有键名都相同的元素。它不会比较数组的值,仅仅根据键名进行匹配。

函数定义:
<span><span><span class="hljs-title function_ invoke__">array_intersect_key</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> ...</span><span><span class="hljs-variable">$arrays</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
参数:
  • $array1:第一个数组,用来与其它数组比较。

  • $array2:第二个数组,包含要与 $array1 比较的键。

  • 额外的数组(可选):可以传入多个数组进行多重比较。

返回值:

返回一个数组,包含所有与其它数组有相同键名的元素。

示例:
<span><span><span class="hljs-variable">$array1</span></span><span> = [
    </span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>,
    </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>
];

</span><span><span class="hljs-variable">$array2</span></span><span> = [
    </span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-number">10</span></span><span>,
    </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-number">20</span></span><span>,
    </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-number">30</span></span><span>
];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_key</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

输出:

<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [a] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [b] =&gt; </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>

在这个示例中,array_intersect_key 比较了 $array1$array2 的键名,返回了键名相同的元素:'a''b'

2. array_intersect_ukey 函数简介

array_intersect_key 类似,array_intersect_ukey 也用于根据数组的键名进行比较,唯一的不同在于它允许你提供一个用户定义的回调函数来进行自定义的键名比较。

函数定义:
<span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$key_compare_func</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> ...</span><span><span class="hljs-variable">$arrays</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
参数:
  • $array1:第一个数组,用来与其它数组比较。

  • $array2:第二个数组,包含要与 $array1 比较的键。

  • $key_compare_func:用户自定义的回调函数,用于比较键名。该函数接收两个键名作为参数,返回一个整数值:如果第一个键小于、等于或大于第二个键,分别返回负数、零或正数。

  • 额外的数组(可选):可以传入多个数组进行多重比较。

返回值:

返回一个数组,包含所有满足用户自定义键名比较函数条件的元素。

示例:
<span><span><span class="hljs-variable">$array1</span></span><span> = [
    </span><span><span class="hljs-string">'apple'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'banana'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>,
    </span><span><span class="hljs-string">'cherry'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>
];

</span><span><span class="hljs-variable">$array2</span></span><span> = [
    </span><span><span class="hljs-string">'apple'</span></span><span> =&gt; </span><span><span class="hljs-number">10</span></span><span>,
    </span><span><span class="hljs-string">'banana'</span></span><span> =&gt; </span><span><span class="hljs-number">20</span></span><span>,
    </span><span><span class="hljs-string">'date'</span></span><span> =&gt; </span><span><span class="hljs-number">30</span></span><span>
];

</span><span><span class="hljs-variable">$key_compare_func</span></span><span> = </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key1</span></span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcasecmp</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>); </span><span><span class="hljs-comment">// 忽略大小写进行比较</span></span><span>
};

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-variable">$key_compare_func</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

输出:

<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [apple] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [banana] =&gt; </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>

在这个示例中,array_intersect_ukey 使用了 strcasecmp 函数来比较键名,忽略了大小写,因此 'apple''banana' 被认为是相同的键。

3. 主要区别对比

特性array_intersect_keyarray_intersect_ukey
比较方式直接比较键名允许通过用户定义的回调函数自定义键名比较方式
用户自定义比较不支持用户自定义比较支持通过回调函数自定义比较规则
使用场景适用于简单的键名比较,且不需要考虑大小写或复杂的比较规则适用于需要复杂或自定义规则的键名比较
性能比较简单,执行效率较高由于涉及用户回调函数,性能可能稍逊于 array_intersect_key

4. 总结

  • array_intersect_key 是一个比较简单且高效的函数,适用于在多个数组中比较键名,且不涉及键名的自定义比较。

  • array_intersect_ukey 允许开发者提供自定义的键名比较函数,这使得它更灵活,适用于需要进行复杂键名比较的场景,但也可能会影响性能。

根据具体的应用需求,可以选择适合的函数来处理键名比较。如果只需要直接的键名匹配,array_intersect_key 就足够了;如果需要更复杂的键名比较逻辑,array_intersect_ukey 则提供了更强大的功能。