當前位置: 首頁> 最新文章列表> PHP 中如何結合array_udiff_assoc 和array_map 來實現數組元素的精確比較?

PHP 中如何結合array_udiff_assoc 和array_map 來實現數組元素的精確比較?

gitbox 2025-09-28
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 這部分與文章內容無關,可以包含任意 PHP 註釋或簡單變量定義</span></span><span>
</span><span><span class="hljs-variable">$dummy</span></span><span> = </span><span><span class="hljs-string">"這是前置無關代碼"</span></span><span>;
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">placeholderFunction</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"佔位函數輸出"</span></span><span>;
}

</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/**
 * PHP 中如何結合 array_udiff_assoc 和 array_map 來實現數組元素的精確比較?
 *
 * 在 PHP 中,當我們需要比較兩個數組的元素,並且希望比較過程能夠考慮鍵名、值以及自定義比較邏輯時,
 * array_udiff_assoc 和 array_map 是兩個非常有用的工具。本文將詳細講解如何結合它們實現數組元素的精確比較。
 *
 * 1. array_udiff_assoc 簡介
 * array_udiff_assoc() 用於比較兩個數組的差異,同時考慮鍵名和鍵值。它的函數原型如下:
 *
 * array_udiff_assoc(array $array1, array $array2, callable $value_compare_func): array
 *
 * 這裡 $value_compare_func 是一個回調函數,用於自定義值的比較邏輯。
 *
 * 2. array_map 簡介
 * array_map() 可以對數組中的每個元素應用回調函數,生成新的數組。原型如下:
 *
 * array_map(callable $callback, array ...$arrays): array
 *
 * 通過 array_map,我們可以在比較前對數組元素進行標準化處理(比如去掉空格、統一大小寫等)。
 *
 * 3. 結合使用的思路
 * - 使用 array_map 對兩個數組進行統一處理,使得元素格式一致。
 * - 然後使用 array_udiff_assoc 比較兩個數組,利用自定義回調實現更精確的差異判斷。
 *
 * 示例代碼:
 */</span>

</span><span><span class="hljs-comment">// 原始數組</span></span><span>
</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-string">' Apple '</span></span><span>,
    </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'Banana'</span></span><span>,
    </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'Cherry'</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-string">'apple'</span></span><span>,
    </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'banana '</span></span><span>,
    </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'Date'</span></span><span>
];

</span><span><span class="hljs-comment">// 統一處理數組元素(去掉前後空格並轉小寫)</span></span><span>
</span><span><span class="hljs-variable">$normalizedArray1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$value</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>));
}, </span><span><span class="hljs-variable">$array1</span></span><span>);

</span><span><span class="hljs-variable">$normalizedArray2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$value</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$value</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-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compareValues</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$value1</span></span></span><span>, </span><span><span class="hljs-variable">$value2</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$value1</span></span><span>, </span><span><span class="hljs-variable">$value2</span></span><span>);
}

</span><span><span class="hljs-comment">// 使用 array_udiff_assoc 獲取 $array1 中與 $array2 不同的元素</span></span><span>
</span><span><span class="hljs-variable">$difference</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff_assoc</span></span><span>(</span><span><span class="hljs-variable">$normalizedArray1</span></span><span>, </span><span><span class="hljs-variable">$normalizedArray2</span></span><span>, </span><span><span class="hljs-string">'compareValues'</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"兩個數組精確比較後的差異元素:\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$difference</span></span><span>);

<span class="hljs-comment">/**
 * 輸出結果:
 * Array
 * (
 *     [c] =&gt; cherry
 * )
 *
 * 解釋:
 * - 元素 'c' =&gt; 'Cherry' 在 $array2 中不存在,因此被識別為差異。
 * - 元素 'a' 和 'b' 經過 trim 和 strtolower 標準化後,被認為是相同的,因此不在結果中。
 *
 * 總結:
 * 通過结合 array_map 和 array_udiff_assoc,可以在比較數組時做到既考慮鍵名,也考慮值,并且可以通過回调函数自定义比较规则,
 * 適用於復雜的數據差異分析需求。
 */</span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>