我试图找到两个多维关联数组之间的差异。具体来说,第一阵列中任何不存在或仅在第二阵列中不同的元素。并非相反。因此,'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数组中的任何内容都不会进行比较,除非相同,否则将返回全部内容。
这将有助于研究如何使其在关联数组和非关联数组上都能正常工作。