當前位置: 首頁> 最新文章列表> 在使用PHP的array_diff()函數時,是否會進行嚴格的值類型匹配?如果有類型不同的值,函數會如何處理?

在使用PHP的array_diff()函數時,是否會進行嚴格的值類型匹配?如果有類型不同的值,函數會如何處理?

M66 2025-06-06

在日常開發中, array_diff()是一個非常實用的PHP 內置函數。它可以用來比較兩個或多個數組,返回在第一個數組中但不在後面數組中的值。這在過濾數據、比對列表差異等場景中非常常見。

那麼問題來了: array_diff()在比較值時,會進行嚴格的類型匹配嗎?也就是說,類型不同但值相同的項,會被視為相同還是不同?

1. array_diff()的值比較機制

在PHP 中, array_diff()使用的是“非嚴格”的比較,也就是說,它在判斷兩個值是否相等時不會比較它們的數據類型,只關注值是否“相等”。

這種比較方式在PHP 中稱為“寬鬆比較”(loose comparison),其行為類似於使用==運算符進行的判斷,而不是===

示例代碼:

 <?php
$array1 = [1, 2, 3, "4"];
$array2 = ["1", 2, 4];

$result = array_diff($array1, $array2);
print_r($result);
?>

輸出結果:

 Array
(
    [2] => 3
    [3] => 4
)

在這個例子中:

  • 1 (整數) 和"1" (字符串) 被認為是相等的,因此被過濾掉了。

  • 3"3"不在$array2中,所以保留。

  • "4"4被認為相等,也被過濾掉。

結論:PHP 的array_diff()不進行嚴格類型比較。

2. 如果要使用嚴格類型比較,怎麼辦?

雖然array_diff()本身不支持嚴格比較,但PHP 提供了另一個函數array_diff_assoc() ,它除了比較值之外,還會比較鍵名。

然而,如果我們只關心值的嚴格比較,可以使用array_udiff() ,配合自定義的比較函數來實現嚴格比較。

示例代碼:

 <?php
$array1 = [1, 2, 3, "4"];
$array2 = ["1", 2, 4];

$result = array_udiff($array1, $array2, function ($a, $b) {
    if ($a === $b) return 0;
    return ($a > $b) ? 1 : -1;
});

print_r($result);
?>

輸出結果:

 Array
(
    [0] => 1
    [2] => 3
    [3] => 4
)

在這個例子中, 1 (int) 和"1" (string) 被視為不同的值,所以1被保留。這樣就達到了嚴格類型比較的目的。

3. 實戰示例:用於數據過濾

假設你有一個來自用戶上傳的商品ID 列表(都是字符串),你希望剔除已經存在於數據庫中的ID(整數),可以用嚴格匹配的方式避免錯誤匹配:

 <?php
$uploadedIDs = ["101", "102", "103"];
$existingIDs = [101, 104];

$diff = array_udiff($uploadedIDs, $existingIDs, function ($a, $b) {
    return $a === $b ? 0 : ($a > $b ? 1 : -1);
});

// 假設你需要構造一個 URL 來展示剩餘的 ID
$url = "https://m66.net/products?ids=" . implode(",", $diff);
echo $url;
?>

輸出URL:

 https://m66.net/products?ids=101,102,103

小結

  • array_diff()使用的是寬鬆比較,不考慮類型差異;

  • 如果需要嚴格匹配值類型,可以使用array_udiff()配合自定義比較函數;

  • 在處理用戶數據、類型敏感的數據過濾時,建議使用嚴格比較以避免邏輯漏洞。

希望這篇文章對你理解PHP 中數組差異函數的行為機制有所幫助!