array_diff()与multidimensional array

使用array_diff() ,我可以比较和删除相似的项目,但如果我有以下数组呢?

数组1

 Array ( [0] => Array ( [ITEM] => 1 ) [1] => Array ( [ITEM] => 2 ) [2] => Array ( [ITEM] => 3 ) ) 

ARRAY2

 Array ( [0] => Array ( [ITEM] => 2 ) [1] => Array ( [ITEM] => 3 ) [2] => Array ( [ITEM] => 1 ) [3] => Array ( [ITEM] => 4 ) ) 

我想过滤出类似的物品; 结果应该返回4.如何重新排列我的数组,以便我可以使用array_diff()

我可能会遍历原始数组,并使它们成为一维…类似的东西

 foreach($array1 as $aV){ $aTmp1[] = $aV['ITEM']; } foreach($array2 as $aV){ $aTmp2[] = $aV['ITEM']; } $new_array = array_diff($aTmp1,$aTmp2); 

你可以使用array_udiff()来定义一个自定义的比较函数。

 function udiffCompare($a, $b) { return $a['ITEM'] - $b['ITEM']; } $arrdiff = array_udiff($arr2, $arr1, 'udiffCompare'); print_r($arrdiff); 

输出:

 Array ( [3] => Array ( [ITEM] => 4 ) ) 

这使用和保留arrays的现有结构,我想你想要的。

使用array_filter几个解决scheme比array_udiff解决scheme对于大型数组性能要差一些,但是它们更直接,更灵活:

 $array1 = [ ['ITEM' => 1], ['ITEM' => 2], ['ITEM' => 3], ]; $array2 = [ ['ITEM' => 2], ['ITEM' => 3], ['ITEM' => 1], ['ITEM' => 4], ]; $arrayDiff = array_filter($array2, function ($element) use ($array1) { return !in_array($element, $array1); }); // OR $arrayDiff = array_filter($array2, function ($array2Element) use ($array1) { foreach ($array1 as $array1Element) { if ($array1Element['ITEM'] == $array2Element['ITEM']) { return false; } } return true; }); 

array_filter ,请注意array_filter保留了原始数组的键,所以如果你想$arrayDiff是零索引的话,可以这样做: $arrayDiff = array_values($arrayDiff);array_filter调用之后。

json_encode技巧的另一个有趣的方法(如果你需要“原始”比较第一级数组中的一些复杂的值,可以是有用的):

 // Compare all values by a json_encode $diff = array_diff(array_map('json_encode', $array1), array_map('json_encode', $array2)); // Json decode the result $diff = array_map('json_decode', $diff);