PHP-多维数组之间的差异

时间:2018-07-24 17:58:04

标签: php arrays array-difference

我试图找到两个多维关联数组之间的差异。具体来说,第一阵列中任何不存在或仅在第二阵列中不同的元素。并非相反。因此,'y'=> 1不属于结果。

$arra = ['x'=>1, 'y'=>1, 'z'=>1, 'add'=>['a'=>1]];
$arrb = ['x'=>2, 'y'=>1, 'add'=>[]];

要获得此结果:

['x'=>1, 'z'=>1, 'add'=>['a'=>1]];

如果数组是一维的,我可以使用array_diff_assoc($arra, $arrb)

但是我可以用来处理内部数组“ add”吗?

我可以编写自己的函数以递归方式查看数组,但是有没有更简单的可用方法?

谢谢。

编辑:使用@abracadaver的答案,我尝试了

function sortAndSerialize($arr){
    ksort($arr);
    return serialize($arr);
}

array_map('unserialize', array_diff(array_map('sortAndSerialize', [$arra]), array_map('sortAndSerialize', [$arrb])));

但是它返回以下内容

Array ( [0] => Array ( [add] => Array ( [a] => 1 ) [x] => 1 [y] => 1 [z] => 1 ) )

注意:我更新了原始数组,使其具有相同和不同的元素。

问题不是重复的。另一个问题使用一个数组,其中每个元素都是一个数组。在这种情况下,元素可以是数组或字符串等。其他解决方案在这里不起作用。

EDIT2 :AbraCadaver答案:

$result = array_filter($arra, function($v, $k) use($arrb) { return (!isset($arrb[$k]) || $arrb[$k] !== $v); }, ARRAY_FILTER_USE_BOTH);

对于我的原始数组是很好的。

但是如果对数组建立索引则不起作用。例如:

$arra = ['x'=>1, 'y'=>1, 'z'=>1, 'add'=>[3,5]];
$arrb = ['x'=>2, 'y'=>1, 'add'=>[3]];

这将返回:

['x'=>1, 'z'=>1, 'add'=>[3,5]];

代替:

['x'=>1, 'z'=>1, 'add'=>[5]];

基本上,非assc数组中的任何内容都不会进行比较,除非相同,否则将返回全部内容。

这将有助于研究如何使其在关联数组和非关联数组上都能正常工作。

0 个答案:

没有答案