在日常開發中, array_diff()是一個非常實用的PHP 內置函數。它可以用來比較兩個或多個數組,返回在第一個數組中但不在後面數組中的值。這在過濾數據、比對列表差異等場景中非常常見。
那麼問題來了: 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()不進行嚴格類型比較。
雖然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被保留。這樣就達到了嚴格類型比較的目的。
假設你有一個來自用戶上傳的商品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 中數組差異函數的行為機制有所幫助!