當前位置: 首頁> 最新文章列表> 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扁平化數組、組合字段值等,來實現對多維數組的交集操作。通過這些方法,您可以靈活地處理多維數組,並根據自己的需求找到交集部分。