在PHP中, 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>] => </span><span><span class="hljs-number">3</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>此時返回的是$array1和$array2中共有的元素。
然而,當我們想要處理多維數組的交集時, array_intersect的默認行為就不再適用了。我們必須先“扁平化”多維數組,將其轉換為一維數組,再進行交集操作,或者通過其它方式對每一項進行比較。
可以通過array_map將多維數組轉換為一維數組,並與另一個數組進行交集。這裡,我們將對多維數組的每個元素進行處理,確保我們比較的是這些元素的值,而非其內部結構。
假設我們有兩個多維數組,數組中的每個元素都是一個關聯數組(或對象):
<span><span><span class="hljs-variable">$array1</span></span><span> = [
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Tom'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Jerry'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </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> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Jerry'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Mickey'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Donald'</span></span><span>],
];
</span></span>我們想要找出這兩個數組中具有相同id的元素。
使用array_map提取每個子數組的id和name鍵。
使用array_intersect比較處理後的數組。
<span><span><span class="hljs-variable">$array1</span></span><span> = [
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Tom'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Jerry'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </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> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Jerry'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Mickey'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </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>) => </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>) => </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>) => </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>] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[id] => </span><span><span class="hljs-number">2</span></span><span>
[name] => Jerry
)
[</span><span><span class="hljs-number">2</span></span><span>] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[id] => </span><span><span class="hljs-number">3</span></span><span>
[name] => Mickey
)
)
</span></span>使用array_map提取出每個元素的id ,生成兩個包含id值的一維數組。
用array_intersect獲取兩個數組中相同的id 。
使用array_filter根據交集的id ,從原始數組中提取出完整的匹配元素。
如果你希望基於多個字段進行交集比較(例如id和name ),可以在array_map中使用複合鍵值或者直接比較多個字段:
<span><span><span class="hljs-variable">$array1</span></span><span> = [
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Tom'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Jerry'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </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> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Jerry'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Mickey'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </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>) => </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>) => </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>) => </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>] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[id] => </span><span><span class="hljs-number">2</span></span><span>
[name] => Jerry
)
[</span><span><span class="hljs-number">2</span></span><span>] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[id] => </span><span><span class="hljs-number">3</span></span><span>
[name] => Mickey
)
)
</span></span>這裡,我們通過將id和name字段組合成一個字符串(如2-Jerry )來進行多字段的比較。 array_intersect使用這個組合的唯一標識符來找出交集。
在PHP中, array_intersect默認不能直接處理多維數組,但我們可以通過一些處理手段,比如使用array_map扁平化數組、組合字段值等,來實現對多維數組的交集操作。通過這些方法,您可以靈活地處理多維數組,並根據自己的需求找到交集部分。