2012-08-06 103 views
26

使用array_diff(),我可以比較和刪除相似的項目,但如果我有以下數組?array_diff()與多維數組

數組1

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

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

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

數組2

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

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

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

我想篩選出類似物品;結果應該返回4.我怎樣才能重新排列我的陣列,以便我可以使用array_diff()

回答

13

我可能會通過原陣列進行迭代,並讓他們一維...像

foreach($array1 as $aV){ 
    $aTmp1[] = $aV['ITEM']; 
} 

foreach($array2 as $aV){ 
    $aTmp2[] = $aV['ITEM']; 
} 

$new_array = array_diff($aTmp1,$aTmp2); 
47

您可以定義使用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 
     ) 
) 

這使用,並保留陣列的現有結構,我假設你想要的。

+6

我知道這是一個老話題,但對於其他使用不是整數但是字符串的id的用戶,您可能需要使用return strcmp($ a ['ITEM],$ b ['ITEM']) udiffCompare函數 – despina 2014-03-28 14:14:29

+10

在PHP7及更高版本中,您可以使用[spaceship operator](https:// wiki。 php.net/rfc/combined-comparison-operator):'return $ a ['ITEM'] <=> $ b ['ITEM'];' – bishop 2015-06-08 17:38:32

6

一對夫婦使用array_filter了比the array_udiff solution對於大數組少高性能,但有一點更簡單,更靈活的解決方案:

$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設爲零索引,請在調用array_filter之後執行$arrayDiff = array_values($arrayDiff);

5

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

謝謝,只有這樣才行。對稱版本'公共靜態函數myArrayDiff($ array1,$ array2) { return array_map('json_decode',array_merge( array_diff(array_map('json_encode',$ array1),array_map('json_encode',$ array2)), (array_map('json_encode',$ array2),array_map('json_encode',$ array1)) )); }' – Dimmduh 2017-03-07 11:00:44

0

您可以使用下面的代碼來獲得差異

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

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

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

array_diff(array_column($a1, 'ITEM'), array_column($a2, 'ITEM'));