2012-08-06 46 views
26

Sử dụng array_diff(), tôi có thể so sánh và xóa các mục tương tự, nhưng nếu tôi có các mảng sau đây thì sao?array_diff() với mảng đa chiều

array1

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

Tôi muốn lọc ra các mặt hàng tương tự; kết quả sẽ trở lại 4. Làm thế nào tôi có thể sắp xếp lại mảng của mình để tôi có thể sử dụng array_diff()?

Trả lời

13

tôi có lẽ sẽ lặp qua mảng ban đầu và làm cho họ 1 chiều ... một cái gì đó giống như

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

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

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

Bạn có thể định nghĩa một hàm so sánh tùy chỉnh sử dụng array_udiff().

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

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

Output:

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

này sử dụng và bảo tồn cấu trúc hiện có của mảng, mà tôi giả sử bạn muốn.

+6

Tôi biết đây là một chủ đề cũ, nhưng đối với những người khác sử dụng id không phải là số nguyên nhưng chuỗi, bạn có thể muốn sử dụng trả về strcmp ($ a ['ITEM], $ b [' ITEM ']) Hàm udiffCompare – despina

+10

Trong PHP7 và hơn thế nữa, bạn có thể sử dụng toán tử [spaceship] (https: // wiki). php.net/rfc/combined-comparison-operator): 'return $ a ['ITEM'] <=> $ b ['ITEM'];' – bishop

6

Một vài giải pháp sử dụng array_filter rằng ít performant hơn the array_udiff solution cho mảng lớn, nhưng đó là một chút đơn giản hơn và linh hoạt hơn:

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

Như thường lệ với array_filter, lưu ý rằng array_filter bảo tồn các phím của mảng ban đầu, vì vậy nếu bạn muốn $arrayDiff không được lập chỉ mục, hãy thực hiện $arrayDiff = array_values($arrayDiff); sau cuộc gọi array_filter.

5

Một cách tiếp cận vui vẻ với một thủ thuật json_encode (có thể hữu ích nếu bạn cần phải "thô" so sánh một số giá trị phức tạp trong mảng cấp độ đầu tiên):

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

Cảm ơn, chỉ có tác phẩm này. phiên bản đối xứng 'hàm tĩnh công khai myArrayDiff ($ array1, $ array2) { trả về mảng_map ('json_decode', array_merge ( mảng_diff (mảng_map ('json_encode', $ array1), array_map ('json_encode', $ array2)), mảng_diff (mảng_map ('json_encode', $ array2), mảng_map ('json_encode', $ array1)) )); } ' – Dimmduh

0

bạn có thể sử dụng mã dưới đây để có được sự khác biệt

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