我有两个数组,我正在使用
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']
]
来自 key => value 对的两个值只有在
时才被认为是相等的。换句话说,会进行严格的检查,因此字符串表示必须相同。(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] => common set ) ) .
在现代 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
代表数据行。
正确的代码:(Demo)
var_export(
array_udiff($array1, $array2, fn($a, $b) => $a <=> $b)
);
正确的输出:
array (
0 =>
array (
12 => 'new q sets',
),
)