2012-08-06 13 views
26

का उपयोग array_diff(), मैं तुलना और समान आइटम निकाल सकते हैं के साथ है, लेकिन क्या हुआ अगर मैं निम्नलिखित सरणियों है?array_diff() बहुआयामी सरणियों

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

मैं समान आइटमों को फ़िल्टर करना चाहते हैं; परिणाम वापस आना चाहिए 4. मैं अपनी सरणी को पुनर्व्यवस्थित कैसे कर सकता हूं ताकि मैं array_diff() का उपयोग कर सकूं?

उत्तर

13

मैं शायद मूल सरणियों के माध्यम से पुनरावृति करेंगे और उनका 1-आयामी बनाने ... की तरह

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

मुझे पता है कि यह एक छोटा सा विषय है, लेकिन उन लोगों के लिए जो पूर्णांक नहीं हैं लेकिन तारों का उपयोग करते हैं, तो आप वापसी strcmp ($ a ['ITEM], $ b [' ITEM ']) का उपयोग करना चाहेंगे udiffCompare फ़ंक्शन – despina

+10

PHP7 और उससे आगे में, आप [स्पेसशिप ऑपरेटर] (https: // विकी) का उपयोग कर सकते हैं। php.net/rfc/combined-comparison-operator): '$ एक [ 'आइटम'] <=> $ ख [ 'आइटम'] वापसी;' – bishop

6

कि बड़े सरणियों के लिए the array_udiff solution से कम performant रहे हैं, लेकिन जो एक छोटे से अधिक सरल और अधिक लचीले होते हैं array_filter का उपयोग कर समाधान के एक जोड़े:

$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 की चाबी को बरकरार रखता है मूल सरणी, इसलिए यदि आप कॉल के बाद को शून्य-अनुक्रमित करने के लिए चाहते हैं, तो करें।

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) { वापसी array_map (' json_decode ', array_merge ( array_diff (array_map (' json_encode ', $ array1), array_map (' json_encode ', $ array2)), array_diff (array_map ('json_encode', $ array2), array_map ('json_encode', $ array1)) )); } ' – Dimmduh

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')); 
संबंधित मुद्दे