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,你可以快速找出数据间的差异,方便定位接口调试问题或数据不一致的原因。结合反向对比和递归处理多维数组,将使数据对比更加准确和全面。
这种方法简单高效,适合多数调试场景。欢迎尝试并根据实际业务需求进行扩展。