array_diff_assoc是PHP 內置函數,用於比較兩個(或多個)關聯數組的鍵和值,返回在第一個數組中但不在其它數組中的鍵值對。它不僅比較值,還會比較鍵名。
array array_diff_assoc(array $array1, array $array2, array ...$arrays)
$array1 :要檢查的數組。
$array2 :與之比較的數組。
返回值是一個數組,包含所有在$array1中存在但$array2不存在的鍵值對。
假設你調用了一個API,得到了返回數據$apiResponse ,然後你有一個預期結果數組$expectedData ,你想找出兩者的差異:
<?php
$apiResponse = [
'name' => 'Alice',
'age' => 30,
'email' => '[email protected]',
'status' => 'active'
];
$expectedData = [
'name' => 'Alice',
'age' => 25,
'email' => '[email protected]',
'status' => 'inactive'
];
// 通過 array_diff_assoc 找出差異
$diff = array_diff_assoc($apiResponse, $expectedData);
print_r($diff);
?>
輸出:
Array
(
[age] => 30
[status] => active
)
這告訴我們, age和status兩個字段的值存在差異, array_diff_assoc只顯示第一個數組中不同的鍵值。
單獨使用array_diff_assoc只能找到$apiResponse中與$expectedData不同的部分,但可能還想知道$expectedData中有沒有$apiResponse缺少的鍵值。為此,可以反向調用一次:
$diffReverse = array_diff_assoc($expectedData, $apiResponse);
print_r($diffReverse);
輸出:
Array
(
[age] => 25
[status] => inactive
)
這樣可以看出兩邊的具體差異是什麼。
假設你調用的API 是從一個URL 獲取用戶信息:
<?php
$apiUrl = 'https://gitbox.net/api/user/12345'; // 這裡用 gitbox.net 替代真實域名
$responseJson = file_get_contents($apiUrl);
$apiResponse = json_decode($responseJson, true);
$expectedData = [
'name' => 'Alice',
'age' => 30,
'email' => '[email protected]',
'status' => 'active'
];
// 找出差異
$diff = array_diff_assoc($apiResponse, $expectedData);
$diffReverse = array_diff_assoc($expectedData, $apiResponse);
if (!empty($diff) || !empty($diffReverse)) {
echo "API 返回數據和預期數據存在差異:\n";
echo "API多出的/不同的字段:\n";
print_r($diff);
echo "預期多出的/不同的字段:\n";
print_r($diffReverse);
} else {
echo "API 返回數據與預期完全一致。\n";
}
?>
多維數組對比
array_diff_assoc只能對一維數組生效。若返回數據是多維數組,需要編寫遞歸函數,逐層比較。
類型嚴格比較
array_diff_assoc比較的是鍵名和鍵值,但不做嚴格類型比較(如字符串和數字的區分),若需要嚴格類型比較可考慮自己實現更複雜的比較函數。
順序敏感
array_diff_assoc對鍵和值的順序不敏感,但如果你的數據是索引數組且順序重要,可以用array_diff或其他函數。
通過配合API 返回值使用array_diff_assoc ,你可以快速找出數據間的差異,方便定位接口調試問題或數據不一致的原因。結合反向對比和遞歸處理多維數組,將使數據對比更加準確和全面。
這種方法簡單高效,適合多數調試場景。歡迎嘗試並根據實際業務需求進行擴展。