当前位置: 首页> 最新文章列表> PHP中如何用array_intersect处理多维数组?有没有具体的方法和案例分享?

PHP中如何用array_intersect处理多维数组?有没有具体的方法和案例分享?

gitbox 2025-09-22

在PHP中,array_intersect 函数通常用于返回两个或多个数组的交集。然而,当处理多维数组时,这个函数默认只适用于一维数组,并不能直接对多维数组进行交集计算。为了在多维数组中实现交集,通常需要采取一些额外的步骤。

1. array_intersect基本用法

首先,了解array_intersect的基本用法是很重要的。此函数的语法如下:

<span><span><span class="hljs-title function_ invoke__">array_intersect</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 中相同的元素,多个数组传入时会返回所有数组中的交集部分。

例如,两个一维数组的交集:

<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect</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>
(
    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; </span><span><span class="hljs-number">3</span></span><span>
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>

此时返回的是 $array1$array2 中共有的元素。

2. 处理多维数组时的挑战

然而,当我们想要处理多维数组的交集时,array_intersect 的默认行为就不再适用了。我们必须先“扁平化”多维数组,将其转换为一维数组,再进行交集操作,或者通过其它方式对每一项进行比较。

3. 解决方案:使用array_maparray_intersect

可以通过array_map将多维数组转换为一维数组,并与另一个数组进行交集。这里,我们将对多维数组的每个元素进行处理,确保我们比较的是这些元素的值,而非其内部结构。

示例案例

假设我们有两个多维数组,数组中的每个元素都是一个关联数组(或对象):

<span><span><span class="hljs-variable">$array1</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Tom'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Mickey'</span></span><span>],
];

</span><span><span class="hljs-variable">$array2</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Mickey'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Donald'</span></span><span>],
];
</span></span>

我们想要找出这两个数组中具有相同 id 的元素。

步骤:

  1. 使用 array_map 提取每个子数组的 idname 键。

  2. 使用 array_intersect 比较处理后的数组。

<span><span><span class="hljs-variable">$array1</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Tom'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Mickey'</span></span><span>],
];

</span><span><span class="hljs-variable">$array2</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Mickey'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Donald'</span></span><span>],
];

</span><span><span class="hljs-comment">// 提取每个元素的 'id' 和 'name' 作为交集比较依据</span></span><span>
</span><span><span class="hljs-variable">$array1_ids</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(fn(</span><span><span class="hljs-variable">$item</span></span><span>) =&gt; </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>], </span><span><span class="hljs-variable">$array1</span></span><span>);
</span><span><span class="hljs-variable">$array2_ids</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(fn(</span><span><span class="hljs-variable">$item</span></span><span>) =&gt; </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>], </span><span><span class="hljs-variable">$array2</span></span><span>);

</span><span><span class="hljs-comment">// 计算两个数组的交集(根据 id 判断)</span></span><span>
</span><span><span class="hljs-variable">$intersection_ids</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect</span></span><span>(</span><span><span class="hljs-variable">$array1_ids</span></span><span>, </span><span><span class="hljs-variable">$array2_ids</span></span><span>);

</span><span><span class="hljs-comment">// 获取交集的完整元素</span></span><span>
</span><span><span class="hljs-variable">$intersection</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, fn(</span><span><span class="hljs-variable">$item</span></span><span>) =&gt; </span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>], </span><span><span class="hljs-variable">$intersection_ids</span></span><span>));

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$intersection</span></span><span>);
</span></span>

输出结果:

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

    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [id] =&gt; </span><span><span class="hljs-number">3</span></span><span>
            [name] =&gt; Mickey
        )
)
</span></span>

解释:

  1. 使用 array_map 提取出每个元素的 id,生成两个包含 id 值的一维数组。

  2. array_intersect 获取两个数组中相同的 id

  3. 使用 array_filter 根据交集的 id,从原始数组中提取出完整的匹配元素。

4. 扩展:处理多维数组中多个字段的交集

如果你希望基于多个字段进行交集比较(例如 idname),可以在 array_map 中使用复合键值或者直接比较多个字段:

<span><span><span class="hljs-variable">$array1</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Tom'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Mickey'</span></span><span>],
];

</span><span><span class="hljs-variable">$array2</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Mickey'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Donald'</span></span><span>],
];

</span><span><span class="hljs-comment">// 组合 id 和 name 字段,形成唯一标识符</span></span><span>
</span><span><span class="hljs-variable">$array1_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(fn(</span><span><span class="hljs-variable">$item</span></span><span>) =&gt; </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">'-'</span></span><span> . </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>], </span><span><span class="hljs-variable">$array1</span></span><span>);
</span><span><span class="hljs-variable">$array2_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(fn(</span><span><span class="hljs-variable">$item</span></span><span>) =&gt; </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">'-'</span></span><span> . </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>], </span><span><span class="hljs-variable">$array2</span></span><span>);

</span><span><span class="hljs-comment">// 获取交集的键</span></span><span>
</span><span><span class="hljs-variable">$intersection_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect</span></span><span>(</span><span><span class="hljs-variable">$array1_keys</span></span><span>, </span><span><span class="hljs-variable">$array2_keys</span></span><span>);

</span><span><span class="hljs-comment">// 获取交集的完整元素</span></span><span>
</span><span><span class="hljs-variable">$intersection</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, fn(</span><span><span class="hljs-variable">$item</span></span><span>) =&gt; </span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">'-'</span></span><span> . </span><span><span class="hljs-variable">$item</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>], </span><span><span class="hljs-variable">$intersection_keys</span></span><span>));

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$intersection</span></span><span>);
</span></span>

输出结果:

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

    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
        (
            [id] =&gt; </span><span><span class="hljs-number">3</span></span><span>
            [name] =&gt; Mickey
        )
)
</span></span>

解释:

这里,我们通过将 idname 字段组合成一个字符串(如 2-Jerry)来进行多字段的比较。array_intersect 使用这个组合的唯一标识符来找出交集。

5. 总结

在PHP中,array_intersect 默认不能直接处理多维数组,但我们可以通过一些处理手段,比如使用 array_map 扁平化数组、组合字段值等,来实现对多维数组的交集操作。通过这些方法,您可以灵活地处理多维数组,并根据自己的需求找到交集部分。