У меня есть два массива. Я хочу разницу между этими двумя массивами. То есть, как я могу найти значения, которые не существуют в обоих массивах?
$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);
Примечание: этот ответ вернет значения в $ array2, которых нет в $ array1, он не вернет значения в $ array1, которые не находятся в $ array2.
$diff = array_diff($array2, $array1);
array_diff()
Чтобы получить разницу между двумя массивами, вам необходимо сделать следующее:
$fullDiff = array_merge(array_diff($array1, $array2), array_diff($array2, $array1));
Причина в том, что array_diff()
будет давать только значения, которые находятся в $array1
но не $array2
, а не наоборот. Вышеуказанное даст вам обоим.
Если вы хотите получить разницу между массивами рекурсивно, попробуйте эту функцию:
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);
<?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 )