php 通过另一个二维数组中的行过滤二维数组中的行

kmbjn2e3  于 2023-04-04  发布在  PHP
关注(0)|答案(3)|浏览(138)

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

1zmg4dgp1#

key =〉value对中的两个值只有当(string) $elem1 === (string) $elem2时才被认为相等。换句话说,严格检查发生,因此字符串表示必须相同。
http://php.net/manual/en/function.array-diff-assoc.php
The (string) value of any array is "Array" .因此,对array_diff_assoc的调用实际上是在比较这两件事:

Array ( [0] => "Array" [1] => "Array" ) 
Array ( [0] => "Array" )

由于这两个数组之间的不同之处在于第一个数组中的[1]键/值对,因此您可以将其返回([1] => Array( [11] => common set ))。

uubf1zoe

uubf1zoe2#

在array_diff_assoc()中,键也被比较。因为[0]在第二个数组中可用,而[1]在第二个数组中不可用,所以这就是为什么结果是Array([1] =〉Array([11] =〉common set))。

e4yzc0pl

e4yzc0pl3#

当在现代php环境中运行脚本时,警告应该表明您使用了错误的工具。
错误代码:(Demo

$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',
  ),
)

相关问题