To compare two arrays while taking into account duplicate values

I have two arrays

$array1 = array(1, 2, 2, 3); $array2 = array( 1, 2, 3,4); 

and when:

 var_dump(array_diff($array1, $array2)); 

receipt:

 array(0){} 

as a conclusion, but I'm looking for:

 array(1){[2]=>2} 

Can someone please let me know how to do this.

Thanks at Advance

+4
source share
4 answers

try it

 $array1 = array(1, 2, 2, 3, 4, 5, 5, 7); $array2 = array(1, 2, 4, 6, 3, 3, 5); $diff = array_filter($array1, function ($val) use (&$array2) { $key = array_search($val, $array2); if ( $key === false ) return true; unset($array2[$key]); return false; } ); print_r($diff); // Array ( [2] => 2 [6] => 5 [7] => 7 ) 
+3
source

If you want to count the number of repeating elements from the same array, as well as from multiple arrays, use the code below,

 <?php $array1 = array(1,2,2,3,7); $array2 = array(1,2,3,4); $diff_array = array(); $diff_array1 = array_count_values($array1); $diff_array2 = array_count_values($array2); $a = array_keys($diff_array1); $b = array_keys($diff_array2); for($i=0;$i<count($a);$i++) { if($a[$i] == $b[$i]) { $x = $a[$i]; $y = $b[$i]; $diff_array1[$x] += $diff_array2[$y]; } } $diff_array1=array_diff($diff_array1, array('1')); echo '<pre>'; print_r($diff_array1); ?> 
+3
source

This will give you the desired result:

 $array1 = array(1, 2, 2, 3); $array2 = array( 1, 2, 3,4); $countArray1 = array_count_values($array1); $countArray2 = array_count_values($array2); foreach($countArray1 as $value=>$count) { if($count > 1) $dupArray[] = $value; } foreach($countArray2 as $value=>$count) { if($count > 1) $dupArray[] = $value; } print_r($dupArray); 

Result

  Array
 (
     [0] => 2
 ) 

Explanation

Using array_count_values will read all array values ​​that look like this:

  Array
 (
     [1] => 1
     [2] => 2
     [3] => 1
 )

 Array
 (
     [1] => 1
     [2] => 1
     [3] => 1
     [4] => 1
 ) 

Then we iterate over each array_count_values to find values ​​that happen more than once. This will work if you have multiple sets of duplicate values:

 $array1 = array(1, 2, 2, 3); $array2 = array( 1, 2, 3, 4, 3); 

Result

  Array
 (
     [0] => 2
     [1] => 3
 ) 
+1
source

Although it may be less elegant, an easy way to do this is with a for loop:

 $diff_array = array(); for ($i = 0; ($i < count($array1)) and ($i < count($array2)); $i++) { if ($array1[$i] !== $array2[$i]) { $diff_array[$i] = $array1[$i]; } } 
-1
source

Source: https://habr.com/ru/post/1442737/


All Articles