2012-08-06 19 views
26

array_diff() kullanarak, benzer öğeleri karşılaştırabilir ve kaldırabilirim, ancak aşağıdaki diziler varsa ne olur?array_diff() çok boyutlu dizilerle

Dizi1

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

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

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

dizi2

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

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

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

Ben benzer öğeleri filtrelemek istiyorum; sonuç dönmelidir 4. array_diff() kullanabilmem için dizimi nasıl yeniden düzenleyebilirim?

cevap

13

Herhalde Sen array_udiff() kullanarak özel bir karşılaştırma işlevi tanımlayabilirsiniz ...

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

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

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

gibi bir şey orijinal diziler arasında yineleme ve onları 1 boyutlu hale getirecektir.

function udiffCompare($a, $b) 
{ 
    return $a['ITEM'] - $b['ITEM']; 
} 

$arrdiff = array_udiff($arr2, $arr1, 'udiffCompare'); 
print_r($arrdiff); 

Çıktı:

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

Bu kullanır ve ne istediğini varsayalım dizilerdeki mevcut yapıyı korur.

+6

Bu biraz eski bir konu olduğunu biliyorum, ancak tamsayılar ancak dizeleri olmayan kimlikler kullanan diğerleri için, geri dönüş strcmp ($ a ['ITEM], $ b [' ITEM ']) kullanmak isteyebilirsiniz udiffCompare işlevi – despina

+10

PHP7 ve sonrasında, [uzay gemisi işleci] 'ni (https: // wiki) kullanabilirsiniz. php.net/rfc/combined-comparison-operator): '$ a ['ITEM'] <=> $ b ['ITEM'];' – bishop

6

büyük diziler için the array_udiff solution daha az ölçülebilir, ama hangi biraz daha basit ve daha esnektir array_filter kullanarak çözümlerin bir çift: Her zaman olduğu gibi array_filter ile

$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 anahtarlarını korur unutmayın Özgün dizi, $arrayDiff sıfır dizinli olmasını istiyorsanız array_filter çağrıdan sonra $arrayDiff = array_values($arrayDiff); yapın.

5

bir json_encode hile ile bir başka eğlenceli yaklaşımı (siz "ham" birinci düzey dizide bazı karmaşık değerleri karşılaştırmak için gerekiyorsa bu yararlı olabilir):

// 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

Teşekkürler, sadece bu işe yarar. simetrik sürüm 'public static işlevi myArrayDiff ($ dizi1, $ dizi2) { return dizisi_map ('json_decode', array_merge ( array_diff (array_map ('json_encode', $ dizi1), array_map ('json_encode', $ dizi2)), array_diff (array_map ('json_encode', $ dizi2), dizi_map ('json_encode', $ dizi1)) )); } ' – Dimmduh

0

farkı

almak için kod aşağıda kullanabilirsiniz
$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'));