1

我有两个数组,我使用array_diff_assoc() php函数来获取差异,但它总是返回通信集作​​为差异,但它应该是新的 q 集这是什么问题,请帮忙

数组——

Array ( [0] => Array ( [12] => new q sets ) [1] => Array ( [11] => common set ) ) 

Array ( [0] => Array ( [11] => common set ) ) 

使用 array_diff_assoc() 操作后

Array ( [1] => Array ( [11] => common set ) ) 
4

3 回答 3

6

来自 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 ))。

于 2012-03-27T07:49:57.603 回答
1

在 array_diff_assoc() 中,还比较了键。由于 [0] 在第二个数组中可用,而 [1] 在第二个数组中不可用,因此结果为 Array ( [1] => Array ( [11] => common set ) ) 。

于 2012-03-27T07:52:52.683 回答
0

在现代 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()来比较关联行(并忽略第一级键)。使用“宇宙飞船运算符”可以进行 3 路比较——正如array_udiff()回调所期望的那样——无需迭代函数调用。在下面的代码段中,$a表示$b数据行。

正确的代码:(演示

var_export(
    array_udiff($array1, $array2, fn($a, $b) => $a <=> $b)
);

正确的输出:

array (
  0 => 
  array (
    12 => 'new q sets',
  ),
)
于 2022-02-20T23:13:21.627 回答