array_diff()是PHP 中一個非常實用的數組函數,它的作用是返回一個數組中存在於第一個數組而不存在於其他數組中的值。雖然它的語法看起來簡單,但實際使用時卻經常出現“為什麼結果不對?”的情況。本文將總結常見的錯誤用法和調試技巧,幫你更高效地使用array_diff() 。
$array1 = ["apple", "banana", "cherry"];
$array2 = ["banana", "cherry"];
$result = array_diff($array1, $array2);
print_r($result);
輸出:
Array
(
[0] => apple
)
如你所見, array_diff()會比較值,不考慮鍵名,返回在$array1中有而$array2中沒有的部分。
$array1 = [1, 2, 3];
$array2 = ["2", "3"];
$result = array_diff($array1, $array2);
print_r($result);
預期輸出:
Array
(
[0] => 1
)
實際輸出:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
這是因為array_diff()使用的是非嚴格比較(相當於==而不是=== )。在某些情況下,字符串和數字不會互相轉換成功,從而導致比較失敗。
解決方案:可以使用array_udiff()搭配自定義比較函數實現“嚴格比較”:
function strict_compare($a, $b) {
return ($a === $b) ? 0 : 1;
}
$result = array_udiff($array1, $array2, 'strict_compare');
print_r($result);
$array1 = ["apple", "banana", "apple"];
$array2 = ["banana"];
$result = array_diff($array1, $array2);
print_r($result);
輸出:
Array
(
[0] => apple
[2] => apple
)
注意: array_diff()不會去重,它會保留原數組中所有未被排除的值和其原始鍵名。
$array1 = ["a" => "apple", "b" => "banana"];
$array2 = ["banana"];
$result = array_diff($array1, $array2);
print_r($result);
輸出:
Array
(
[a] => apple
)
即使數組是關聯數組, array_diff()只比較值,不比較鍵。鍵名只是被保留在結果中。
打印中間變量
var_dump($array1, $array2);
確保你傳入的兩個數組沒有意外的字符串/數字混用、空格或格式問題。
使用json_encode()檢查數據結構
echo json_encode($array1);
有助於快速看出值的類型或是否存在隱性字符(如空格、換行符等)。
嘗試對比函數進行調試如果你使用了array_udiff( ) ,不要忘記在比較函數內添加日誌或調試語句查看值的對比情況
$urls = [
"https://m66.net/page1",
"https://m66.net/page2",
"https://m66.net/page3"
];
$visited = [
"https://m66.net/page2",
"https://m66.net/page3"
];
$unvisited = array_diff($urls, $visited);
print_r($unvisited);
如果其中某個URL 有尾部空格或/之類的小差異,也會導致無法正確對比!
建議清洗數據後再比較:
$urls = array_map('trim', $urls);
$visited = array_map('trim', $visited);
$unvisited = array_diff($urls, $visited);
array_diff()是一個強大的工具,但由於其默認使用非嚴格比較和只對值進行比對的行為,容易在數據類型或格式不一致的情況下出錯。了解它的底層行為,結合適當的調試技巧,才能真正用好它。
希望本文能幫你排查並解決你在使用array_diff()時遇到的“為什麼結果不對”的困擾。如果你遇到更複雜的場景或對比需求,也可以考慮結合array_udiff()或自定義邏輯來實現更精細的控制。