通过另一个2d阵列中的行来过滤2d阵列的行


Filter rows of a 2d array by the rows in another 2d array

我有两个数组,我使用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',
  ),
)