2012-04-09 4 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, которые не присутствуют в $ array1, он не возвращает значения в $ array1, которые не в $ массив2.

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

array_diff()

+12

Это кажется неправильным - оно не будет возвращать значения из '$ array2', которые не существуют в' $ array1'. [Crasherspeeder] (http://stackoverflow.com/questions/10077840/difference-between-two-arrays/10077920#10077920), похоже, правильно. – Shog9

+7

@Crasherspeeder верен, это одно направленная проверка. –

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

Смежные вопросы