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);