2012-04-09 107 views
25

我有以下兩個數組。我想要這兩個數組之間的區別。也就是說,我怎樣才能找到兩個數組中不存在的值?兩個陣列之間的區別

$array1=Array ([0] => 64 [1] => 98 [2] => 112 [3] => 92 [4] => 92 [5] => 92) ; 
$array2=Array ([0] => 3 [1] => 26 [2] => 38 [3] => 40 [4] => 44 [5] => 46 [6] => 48 [7] => 52 [8] => 64 [9] => 68 [10] => 70 [11] => 72 [12] => 102 [13] => 104 [14] => 106 [15] => 92 [16] => 94 [17] => 96 [18] => 98 [19] => 100 [20] => 108 [21] => 110 [22] => 112); 

回答

25

注:這個答案將返回$數組2中不存在在$陣列1的值,它不會返回$ array1中不在$數組2的值。

$diff = array_diff($array2, $array1); 

array_diff()

+12

這似乎是不正確的 - 它不會從'$ array1'中不存在的'$ array2'返回值。 [Crasherspeeder](http://stackoverflow.com/questions/10077840/difference-between-two-arrays/10077920#10077920)似乎是正確的。 – Shog9 2012-10-15 16:12:31

+7

@Crasherspeeder是正確的,這是一個單向檢查 - 提問者既要。 – 2013-11-07 03:35:42

118

爲了得到你需要做以下兩個陣列之間的區別:

$fullDiff = array_merge(array_diff($array1, $array2), array_diff($array2, $array1)); 

原因是,array_diff()只會給你,在$array1的值,但而不是$array2,而不是相反。以上將給你兩個。

1
<?php 
function getArrayDiff($a1, $a2) { 
    $result = array(); 

    print_r($a1); 
    print_r($a2); 

    // If First Array is Bigger than Second 
    if(count($a1) > count($a2)) { 
     $result=array_diff($a1,$a2); 
    } 
    // If Second Array is Bigger than First 
    if(count($a1) < count($a2)) { 
     $result=array_diff($a2,$a1); 
    } 
    // If Both array are same but, data values are different. 
    else 
    { 
     $result = array_merge (array_diff($a2,$a1), array_diff($a1,$a2)); 
    } 
    return $result; 
} 

print "<pre>"; 
// First Array is Big 
echo "First Array is Big <br/>"; 
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"); 
$a2=array("e"=>"red","f"=>"green","g"=>"blue"); 
print_r(getArrayDiff($a1, $a2)); 

// Second Array is Big 
echo "Second Array is Big <br/>"; 
$a1=array("e"=>"red","f"=>"green","g"=>"blue"); 
$a2=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"); 
print_r(getArrayDiff($a1, $a2)); 

// Both Array are same 
echo "Both Array are same <br/>"; 
$a1=array("a"=>"red","b"=>"green","d"=>"yellow"); 
$a2=array("e"=>"red","f"=>"green","g"=>"blue"); 
print_r(getArrayDiff($a1, $a2)); 

?> 

輸出:

First Array is Big 
Array 
(
    [a] => red 
    [b] => green 
    [c] => blue 
    [d] => yellow 
) 
Array 
(
    [e] => red 
    [f] => green 
    [g] => blue 
) 
Array 
(
    [d] => yellow 
) 
Second Array is Big 
Array 
(
    [e] => red 
    [f] => green 
    [g] => blue 
) 
Array 
(
    [a] => red 
    [b] => green 
    [c] => blue 
    [d] => yellow 
) 
Array 
(
    [d] => yellow 
) 
Both Array are same 
Array 
(
    [a] => red 
    [b] => green 
    [d] => yellow 
) 
Array 
(
    [e] => red 
    [f] => green 
    [g] => blue 
) 
Array 
(
    [g] => blue 
    [d] => yellow 
) 
5

如果你想獲得陣列之間的差異遞歸,試試這個功能:

function arrayDiffRecursive($firstArray, $secondArray, $reverseKey = false) 
{ 
    $oldKey = 'old'; 
    $newKey = 'new'; 
    if ($reverseKey) { 
     $oldKey = 'new'; 
     $newKey = 'old'; 
    } 
    $difference = []; 
    foreach ($firstArray as $firstKey => $firstValue) { 
     if (is_array($firstValue)) { 
      if (!array_key_exists($firstKey, $secondArray) || !is_array($secondArray[$firstKey])) { 
       $difference[$oldKey][$firstKey] = $firstValue; 
       $difference[$newKey][$firstKey] = ''; 
      } else { 
       $newDiff = arrayDiffRecursive($firstValue, $secondArray[$firstKey], $reverseKey); 
       if (!empty($newDiff)) { 
        $difference[$oldKey][$firstKey] = $newDiff[$oldKey]; 
        $difference[$newKey][$firstKey] = $newDiff[$newKey]; 
       } 
      } 
     } else { 
      if (!array_key_exists($firstKey, $secondArray) || $secondArray[$firstKey] != $firstValue) { 
       $difference[$oldKey][$firstKey] = $firstValue; 
       $difference[$newKey][$firstKey] = $secondArray[$firstKey]; 
      } 
     } 
    } 
    return $difference; 
} 

測試:

$differences = array_replace_recursive(
    arrayDiffRecursive($firstArray, $secondArray), 
    arrayDiffRecursive($secondArray, $firstArray, true) 
); 
var_dump($differences); 
+0

最好的遞歸數組差異在網絡上的php – apfz 2016-10-26 05:21:54