我有两个数组,我使用array_diff_assoc()
来获得差异,但它总是在结果中返回common set
行
它应该返回new q sets
行。我的方法出了什么问题?
样本数据:
$array1 = [
[12 => 'new q sets'],
[11 => 'common set']
]
$array2 => [
[11 => 'common set']
];
调用array_diff_assoc($array1, $array2)
后,我的输出是:
[
[11 => 'common set']
]
只有当
(string) $elem1 === (string) $elem2
。换句话说,会进行严格的检查,因此字符串表示必须相同。
http://php.net/manual/en/function.array-diff-assoc.php
任何数组的(string)
值都是"Array"
。因此,您对array_diff_assoc
的调用有效地比较了这两件事:
Array ( [0] => "Array" [1] => "Array" )
Array ( [0] => "Array" )
由于这两者之间的不同之处在于第一个数组中的[1]
键/值对,因此可以返回([1] => Array( [11] => common set )
)。
在array_diff_assoc()中,键也会进行比较。由于[0]在第二个数组中可用,而[1]在第二数组中不可用,因此结果为array([1]=>array([11]=>公共集))。
在现代php环境中运行脚本时,"警告"应指示您使用了错误的工具执行作业。
错误代码:(演示)
$array1 = [[12 => 'new q sets'], [11 => 'common set']];
$array2 = [[11 => 'common set']];
var_export(array_diff_assoc($array1, $array2));
错误输出:
Warning: Array to string conversion in /in/jIUcq on line 6
Warning: Array to string conversion in /in/jIUcq on line 6
array (
1 =>
array (
11 => 'common set',
),
)
实际上,您并不想比较第一级索引,因为相关/匹配的行可能具有不同的第一级索引。
相反,您应该使用array_udiff()
来比较关联行(并忽略第一级键)。正如array_udiff()
从回调中期望的那样,在没有迭代函数调用的情况下进行三向比较是可能的;宇宙飞船操作员";。在下面的代码段中,$a
和$b
表示数据行。
正确代码:(演示)
var_export(
array_udiff($array1, $array2, fn($a, $b) => $a <=> $b)
);
正确输出:
array (
0 =>
array (
12 => 'new q sets',
),
)