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

问题描述 投票:0回答:3

我有两个数组,我正在使用

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']
]
php multidimensional-array filtering associative-array array-difference
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 )
)。


1
投票

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


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()
来比较关联行(并忽略第一级键)。进行三向比较——正如
array_udiff()
对回调的期望——使用“宇宙飞船运算符”可以在没有迭代函数调用的情况下进行。在下面的代码片段中,
$a
$b
代表数据行。

正确的代码:(Demo

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

正确的输出:

array (
  0 => 
  array (
    12 => 'new q sets',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.