Devi A
Devi A

Reputation: 324

Compare two 2d arrays & get intersection and differences

I want to compare the data in whole rows between the two arrays and produce:

I have two multidimensional arrays with me.

$array1 = [
    ['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
    ['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],
    ['sight_id' => 15, 'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India'],
];

$array2 = [
    ['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
    ['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],
    ['sight_id' => 16, 'location' => 'Jaisalmer, Rajasthan, India'],
    ['sight_id' => 17, 'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India'],
];

Desired results:

$intersect_array = [
    ['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
    ['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],

and

$only_a1 = [
    ['sight_id' => 15, 'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India'],
]

and

$only_a2 = [
    ['sight_id' => 16, 'location' => 'Jaisalmer, Rajasthan, India'],
    ['sight_id' => 17, 'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India'],
];

Upvotes: -1

Views: 667

Answers (2)

mickmackusa
mickmackusa

Reputation: 48031

It is not necessary to mutate/prepare your two-dimensional arrays in order to compare the rows. Because whole rows from one array relate to whole rows in the other array, you don't need to specify a column to compare -- just compare the full row data.

Code: (Demo) (Or with a declared function)

echo "Intersection:\n";
var_export(
    array_uintersect($array1, $array2, fn($a, $b) => $a <=> $b)
);

echo "\nUnique in first:\n";
var_export(
    array_udiff($array1, $array2, fn($a, $b) => $a <=> $b)
);

echo "\nUnique in second:\n";
var_export(
    array_udiff($array2, $array1, fn($a, $b) => $a <=> $b)
);

Output:

Intersection:
array (
  0 => 
  array (
    'sight_id' => 13,
    'location' => 'Jodhpur, Rajasthan, India',
  ),
  1 => 
  array (
    'sight_id' => 14,
    'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India',
  ),
)
Unique in first:
array (
  2 => 
  array (
    'sight_id' => 15,
    'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India',
  ),
)
Unique in second:
array (
  2 => 
  array (
    'sight_id' => 16,
    'location' => 'Jaisalmer, Rajasthan, India',
  ),
  3 => 
  array (
    'sight_id' => 17,
    'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India',
  ),
)

Upvotes: 1

David162795
David162795

Reputation: 1866

Convert arrays to a format, where array index is the sight_id:

$b1 =array();
foreach($a1 as $x)
    $b1[$x['sight_id']] = $x['location'];

$b2 =array();
foreach($a2 as $x)
    $b2[$x['sight_id']] = $x['location'];

Calculate the differences and intersection:

$c_intersect = array_intersect_key($b1,$b2);
$c_1 = array_diff_key($b1,$b2);
$c_2 = array_diff_key($b2,$b1);

Convert arrays back to your format:

$intersect_array = array();
foreach($c_intersect as $i=>$v)
    $intersect_array[] = array('sight_id'=>$i,'location'=>$v);

$only_a1 = array();
foreach($c_1 as $i=>$v)
    $only_a1[] = array('sight_id'=>$i,'location'=>$v);

$only_a2 = array();
foreach($c_2 as $i=>$v)
    $only_a2[] = array('sight_id'=>$i,'location'=>$v);

Upvotes: 1

Related Questions